使用标签的事务中的语法错误

时间:2011-01-12 12:17:46

标签: sql sql-server sql-server-2005 tsql

我有一个存储过程,其结构类似于以下

BEGIN TRY
BEGIN TRANSACTION

    IF EXISTS (SELECT Something FROM Somewhere WHERE Something = '123abc')
        GOTO FINISHED

    IF NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = 'abc123')
        SET @ReturnCode = 2

    FINISHED:

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

    ROLLBACK TRANSACTION

END CATCH

假设未使用GOTO。我收到以下两个错误

Line 183
Incorrect syntax near 'F'.
Line 183
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 2.

如果我用IFBEGIN包裹最后一个END,则存储的proc正常工作。这很好,并负责我的语法问题。

问题是我在两个不同的服务器上有这个确切的存储过程。一个人总会得到错误,一个人永远不会得到上面的代码错误。

我唯一能想到的是SQL中可能有一些设置在一台服务器上打开但在另一台服务器上没有打开。有没有人曾经有过这样的事情发生过?

更多详细信息:当第二台服务器安装了SP2时,有问题的服务器已过期且未安装Service Pack。目前正在升级过程中。稍后会更新结果。

2 个答案:

答案 0 :(得分:1)

因此,根据我上次编辑,我安装了Service Pack 3.这解决了我遇到的问题。

显然这在SP2中得到了解决。请参阅以下链接

Link to KB article for SP2 bug fixes

Link to specific bug

答案 1 :(得分:0)

为什么不在第一个IF上反转逻辑并完全消除GOTO废话?

BEGIN TRY
    BEGIN TRANSACTION

    IF NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = '123abc')
        AND NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = 'abc123')
        SET @ReturnCode = 2

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

    ROLLBACK TRANSACTION

END CATCH