【问题标题】:I am unable to use THROW SQL Server 2008 R2我无法使用 THROW SQL Server 2008 R2
【发布时间】:2013-05-16 06:40:31
【问题描述】:

SQL Server 2008 R2 Management Studio 在下面的示例中无法识别我的投掷,它说

Throw 附近的语法不正确

我试图在这里抛出一个错误,所以当有人两次插入相同的值时,我可以在我的网站中处理它。

Begin Try
 insert into BusinessID (BusinessID) values (@ID)
 insert into BusinessID (BusinessID) values (@ID)

End Try

Begin Catch

Print 'PK already exist'
THROW
End Catch

【问题讨论】:

  • THROW 是 SQL Server 2012 中的一个新功能,因此它在 2008 R2 中(还)不可用.....
  • 此外,您似乎需要用分号终止 THROW 之前的语句;否则你会得到一个语法错误!

标签: sql sql-server sql-server-2008-r2 try-catch throw


【解决方案1】:

THROW 语句在 SQL Server 2012

中引入

http://msdn.microsoft.com/en-us/library/ee677615.aspx

您可以改用RAISERROR

http://msdn.microsoft.com/en-us/library/483588bd-021b-4eae-b4ee-216268003e79(v=sql.105)

BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;

【讨论】:

  • 非常感谢,我需要的只是 SQL Server 2012 中引入 Throw 的这个小信息,感谢您澄清 RAISERROR 语句
  • 略有不同。 RAISERROR 不会停止执行,而 THROW 会。
  • @MehmetAVŞAR 这并不完全正确。执行不会因 RAISERROR 或 THROW 而停止,它会根据严重性级别停止。使用 RAISERROR,您可以自己设置严重性,从而选择将停止执行的任何内容。使用 THROW,您不能,默认值为 16,它会停止执行,但是当从 CATCH 块中使用时,它只会转发最后一个已知的异常,可能是也可能不是 16。
  • @NenadZivkovic 我刚刚又试了一次,错误级别 17 并没有停止执行。它只需要用户是 sysadmin 的成员来引发级别高于 18 的错误。CREATE PROCEDURE RaiseMeAnError AS PRINT 'Step 1' RAISERROR('Here is a low level error', 1, 1) PRINT 'Step 2' RAISERROR('Here is a low level error', 17, 1) PRINT 'Step 3'
  • @MehmetAVŞAR PRINT 在执行计划方面是一些特定的命令,并且 SQL 在引发错误之前已经运行了它,尝试在您的演示代码中将其替换为 SELECT,您将看到第三次选择不会发生。
【解决方案2】:

在你的 sql 块中使用 RAISERROR 而不是 Throw。

Begin Try
 insert into BusinessID (BusinessID) values (@ID)
 insert into BusinessID (BusinessID) values (@ID)

End Try

Begin Catch

Print 'PK already exist'
  DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();

-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState -- State.
           );
End Catch

【讨论】:

  • 感谢您的建议,并将您的建议应用于我的确切示例:)
  • 如果ERROR_MESSAGE() LIKE '%[%]s%' 什么的呢?
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多