从 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 备份
Windows Phone 8 SQL Server CE 转换为日期时间时发生溢出