2014-02-10 54 views
4

我正在处理服务器移动后的一些网站和数据库问题。该数据库以前是SQL Server Express 2005,但现在运行在SQL Server Express 2012上。自从迁移到SQL Server 2012后发生RAISERROR问题

这些问题与RAISERROR命令和2012年的更改有关。我已经查看了新语法的文档,但我不确定如何可以将错误号码和消息传递给网站。

在存储过程和触发器的RAISERROR的命令的一些例子:

RAISERROR 50000 'Member with same Email address already exists.' 

RAISERROR 44447 'The record can''t be added or changed. Referential integrity rules require a related record in table ''tblBrand''.' 

RAISERROR 44446 'The record can''t be added or changed. Referential integrity rules require a related record in table ''tblFragranceHouse''.' 

我已经改变了一些新的语法,但我不确定我是否正确或没有这样做。我明白,如果我只是传递错误文本,它会传递错误号50000.但我不知道如何处理其他错误代码。

有关如何将这些命令转换为2012的任何建议?

回答

4

SQL 2012不支持RAISERROR 的无证版本所支持的语法是

RAISERROR(@Message,Serverity,state); 

- @message可能是消息ID,但它应该sysmessages中的存在,因此,如果您要发送自定义消息,我认为你应该添加SYSMESSAGES他们

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

或另一个选择是使用THROW

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

+0

新的语法似乎允许返回一条消息或一个错误号,但不是两个?任何有关返回两者的可能性的建议,以及严重程度和状态用于模仿未记录语法的值? – johna

+0

我不认为你可以同时发送。您需要将自定义消息添加到sys.sysmessages,然后在raiserror中使用消息ID。 否则您需要使用THROW –

+0

只有当错误编号大于50000时,我们才可以将自定义消息添加到sysmessages。原始文章(44446,44447)中的错误编号无法在SQL 2012或更高版本中生成(因为它们是不存在于sysmessages中,不能添加)。 –

5

您可以替换代码如下:

SQL 2008:raiserror 55030 'text error'

SQL 2012:raiserror ('text error', 16, 1)

您将无法设置错误编号,这将是50000默认情况下,但您可以获得相同的错误级别,红色文本等等。

希望它有帮助。