18

在以前的版本中,我们在 t-sql 中引发了错误,例如:

RAISERROR 50000 'My Error Message'

在最新的 SQL Server 中,此语法已停用,并替换为 RaiseError () 语法。

我想要一个引发错误的通用方法,到目前为止我能想到的最好的方法是:

sp_addmessage @msgnum = 50001,
              @severity = 10,
              @msgtext = N'My Error Message', @replace = 'REPLACE';
RAISERROR (50001, 10, 1, 'This error message is not displayed')

但是我不能用 sp_addmessage 为每条消息创建错误消息,因为有 1000 条消息。

使用自定义消息引发消息的更好方法是什么?

4

4 回答 4

23

这似乎有效:

RAISERROR('My Error Message',0,1)
于 2013-04-11T09:03:59.760 回答
18

实际上,自 SQL Server 2012 以来RAISERROR已被弃用。请转到此处了解更多信息。更有趣的方面之一是它是 Rais e rror 而不是 Rais eE rror 导致它在某些圈子中被称为“raise ror”。THROW

来自 BOL 的样本:

USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
(    ID INT PRIMARY KEY
);
BEGIN TRY
    INSERT dbo.TestRethrow(ID) VALUES(1);
--  Force error 2627, Violation of PRIMARY KEY constraint to be raised.
    INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH

    PRINT 'In catch block.';
    THROW;
END CATCH;
于 2013-04-11T13:56:52.630 回答
2

使用s%通配符,以便您可以从任何存储的过程中传递您喜欢的任何消息:

IF NOT EXISTS (SELECT * FROM sys.messages m WHERE m.message_id = 62000)
EXEC sys.sp_addmessage @msgnum = 62000, 
                       @severity = 16, 
                       @msgtext = N'%s', 
                       @lang = 'us_english'

然后在你的 sp 你可以提出这样的错误:

RAISERROR (62000, 16, 1, 'Error and/or Business Error Text goes here')
于 2014-07-15T22:00:59.237 回答
1

或者使用 raise error 的 state 属性

第 1 步:在过程中

RAISERROR ('错误: bla bla 业务检查 1 失败', 16,5)

RAISERROR ('错误: bla bla 业务检查 1 失败', 16,6)

5 = 状态。可以使用 1 到 255 来满足您的目的。1 被系统使用。1以外的任何东西都需要自定义处理

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15 state 是从 0 到 255 的整数。负值默认为 1。不应使用大于 255 的值。

step b) 在 c# 中使用 catch (sqlException e) e.state 可以用来检查

以上对我有用。感谢不同地方的不同文章

于 2020-01-29T20:10:00.113 回答