【问题标题】:SQL Server: error with Transaction and Update statementSQL Server:事务和更新语句出错
【发布时间】:2014-08-17 20:31:36
【问题描述】:

我试图在 Else 语句中连续更新两个表。

因此,我将我的 Update 语句包装在一个事务中,我认为这是正确的方法,但在尝试执行此操作时出现以下错误。所有变量都在存储过程的开头声明。

我在这里错过了什么或做错了什么?

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'ELSE'.
Msg 137, Level 15, State 2, Line 4
Must declare the scalar variable "@parentID".
Msg 137, Level 15, State 2, Line 11
Must declare the scalar variable "@lastUpdate".

我的 SQL(更新:发布完整查询):

ALTER PROCEDURE [dbo].[MOC_UpdateNav]
    @itemID int,
    @parentID int,
    @itemName nvarchar(100),
    @linkRef nvarchar(2000),
    @sortID int,
    @lastUpdate nvarchar(50),
    @modBy varchar(50)
AS
BEGIN
    SET NOCOUNT ON; 

    IF NOT EXISTS 
    (
            SELECT  * 
            FROM    MOC_Links
            WHERE   itemID = @itemID
    )
            INSERT INTO MOC_Links
            (
                    parentID,
                    itemName,
                    linkRef,
                    sortID
            )
            SELECT  @parentID,
                    @itemName,
                    @linkRef,
                    @sortID

            INSERT INTO MOC_Log
            (
                    lastUpdate,
                    modTime,
                    modBy
            )
            SELECT  @lastUpdate,
                    GETDATE(),
                    @modBy
    ELSE
            BEGIN TRANSACTION
                UPDATE  MOC_Links
                SET     parentID = @parentID,
                        itemName = @itemName,
                        linkRef = @linkRef,
                        sortID = @sortID
                WHERE   itemID = @itemID

                UPDATE  MOC_Log
                SET     lastUpdate = @lastUpdate,
                        modTime = GETDATE(),
                        modBy = @modBy
                WHERE   itemID = @itemID
            COMMIT
END

【问题讨论】:

  • begin transaction 不会启动一个块,因此您需要将 begin/end 包裹在 else 块周围。
  • 谢谢。那么我是否只需要在 Commit 下方添加一个 End 或在 Begin Transaction 上方添加另一个 Begin ?

标签: sql sql-server stored-procedures transactions sql-update


【解决方案1】:

确保您已声明 @parentID@lastUpdate 变量,并在 ELSE BLOCK 内将整个事务包装在 BEGIN..END 块内。其余的对我来说都很好。

ALTER PROCEDURE [dbo].[MOC_UpdateNav]
    @itemID int,
    @parentID int,
    @itemName nvarchar(100),
    @linkRef nvarchar(2000),
    @sortID int,
    @lastUpdate nvarchar(50),
    @modBy varchar(50)
AS
BEGIN
    SET NOCOUNT ON; 

    BEGIN TRANSACTION;

    IF NOT EXISTS(SELECT 1 FROM MOC_Links WHERE itemID = @itemID)
      BEGIN  --<-- This block here

            INSERT INTO MOC_Links(parentID, itemName, linkRef, sortID)
            VALUES  (@parentID,@itemName,@linkRef,@sortID)

            INSERT INTO MOC_Log (lastUpdate,modTime,modBy)
            VALUES  (@lastUpdate,GETDATE(),@modBy)
     END
    ELSE
       BEGIN  --<-- This another block here

                UPDATE  MOC_Links
                SET      parentID = @parentID
                        ,itemName = @itemName
                        ,linkRef = @linkRef
                        ,sortID = @sortID
                WHERE   itemID = @itemID

                UPDATE  MOC_Log
                SET     lastUpdate = @lastUpdate
                        ,modTime = GETDATE()
                        ,modBy = @modBy
                WHERE   itemID = @itemID

      END

   COMMIT TRANSACTION;  
END

注意

不知道整个语句是什么样的,但是这个 TRANSACTION 包装器对整个 IF..ELSE 语句更有意义。你不觉得吗?

【讨论】:

  • 非常感谢。我已经在整个 If Else 周围有一个开始和结束。我需要那两次吗?我会更新我的帖子。
  • 没问题,很高兴它有所帮助。 :)
猜你喜欢
  • 2013-07-06
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多