SQL Server:Transaction和Update语句出错

时间:2014-08-17 20:31:37

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

我正在尝试连续更新两个表作为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
蒂姆,非常感谢你提供任何帮助。

1 个答案:

答案 0 :(得分:1)

确保你有DECLARED @parentID@lastUpdate变量,并且在ELSE BLOCK中将整个事务包装在BEGIN..END Block中。其余的对我来说似乎很好。

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语句中更有意义。你不觉得吗?