从 SQL Server 8 到 11 的 RAISERROR 转换

Posted

技术标签:

【中文标题】从 SQL Server 8 到 11 的 RAISERROR 转换【英文标题】:RAISERROR conversion from SQL Server 8 to 11 【发布时间】:2016-02-08 13:32:14 【问题描述】:

我已将数据库从旧的旧版 MSSQL Server 2000 (SQL Server 8) 迁移到 SQL Server 11,并且我在多个触发器中收到了一些错误。

它们是这样形成的。

RAISERROR 20001 @msg

RAISERROR 44444 'Field ''comp_v1'' cannot contain a null value.'

所以经过一些阅读,我发现这是一个已知的变化,但我找不到任何已知的解决方案。

起初我想把它们替换成这样的东西

RAISERROR ('Field ''comp_v1'' cannot contain a null value.',16,-1)

这里的问题是,我不知道这有什么影响,以及是否有从旧行到新行的直接转换。

我假设代码 44444 和 20001 等是有原因的。

【问题讨论】:

【参考方案1】:

我建议你使用THROW 关键字来抛出错误。您可以查看reasons:

使用 THROW 的好处是:不需要传递任何参数来引发异常。 只需使用THROW;语句将获取错误详细信息并引发它

而 RAISERROR

对于 RAISERROR,开发人员必须使用不同的 ERROR_xxxx() 系统函数来获取错误详细信息以通过 RAISERROR() 语句传递,例如:

ERROR_NUMBER() ERROR_MESSAGE() ERROR_SEVERITY() ERROR_STATE()

【讨论】:

所以解决方案就是THROW?有没有从旧到新的神奇转换?系统是否会像 RAISERROR 一样使用 THROW 执行? @ThomasAndreèLian:- 是的,你可以使用 THROW。它将与 RAISERROR 完成相同的工作,因此您不必关心 ERROR_MESSAGE 和所有其他内容:) 有没有办法通过 THROW 传递自定义消息? @ThomasAndreèLian:- Yes you can parameterize the THROW stament. @ThomasAndreèLian:- 一旦你执行了 RAISERROR 或 THROW,那么你通常会调用 RETURN。你也可以查看这个帖子:Why does Sql Server keep executing after raiserror when xact_abort is on?

以上是关于从 SQL Server 8 到 11 的 RAISERROR 转换的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2012 上还原 SQL Server 2000 备份

从 SQL Server 中的当前日期获取当前学年

Windows Phone 8 SQL Server CE 转换为日期时间时发生溢出

SQL Server安全(8/11):数据加密(Data Encryption)

SQL Server:如何组合行

Access 2003:从 SQL Server 2005 切换到 SQL Server 2012 有啥并发症吗?