TSQL Raiserror 语法不正确,遵循 MSD 指南

Posted

技术标签:

【中文标题】TSQL Raiserror 语法不正确,遵循 MSD 指南【英文标题】:TSQL RaiseError incorrect syntax, following MSDN's guidelines 【发布时间】:2017-04-08 16:14:36 【问题描述】:

MSDN 声明以下语法:

RAISERROR (  msg_id | msg_str | @local_variable   
 ,severity ,state   
[ ,argument [ ,...n ] ] )  
[ WITH option [ ,...n ] ] 

msg_str 需要一个最多 2047 个字符的字符串,但会截断更长的字符串。它还可以替换参数,这会比值提供的字符数进一步截断消息:

错误消息最多可包含 2,047 个字符。如果消息包含 2,048 个或更多字符,则仅显示前 2,044 个字符并添加省略号以指示消息已被截断。请注意,由于内部存储行为,替换参数消耗的字符比输出显示的要多。例如,赋值为 2 的 %d 替换参数实际上会在消息字符串中产生一个字符,但在内部也会占用三个额外的存储字符。此存储要求减少了消息输出的可用字符数。 当指定 msg_str 时,RAISERROR 会引发错误编号为 50000 的错误消息。

severity 需要一个介于 0 到 25 之间的数字,但会更正其他数字:

任何用户都可以指定从 0 到 18 的严重级别。从 19 到 25 的严重级别只能由 sysadmin 固定服务器角色的成员或具有 ALTER TRACE 权限的用户指定。对于从 19 到 25 的严重级别,需要 WITH LOG 选项。小于 0 的严重级别被解释为 0。大于 25 的严重级别被解释为 25。

state 需要 0 到 255 的值,但会更正零以下值:

[state] 是 0 到 255 之间的整数。负值默认为 1。不应使用大于 255 的值。


问题

我在运行这些查询时收到以下错误:

RAISEERROR('Test', 20, 1);

消息 102,第 15 级,状态 1,第 1 行

“测试”附近的语法不正确。


DECLARE @err_message nvarchar(255);
SET @err_message = 'Test';
RAISEERROR(@err_message, 20, 1);

消息 102,级别 15,状态 1,第 3 行

“RAISEERROR”附近的语法不正确。


我可以很好地执行其他各种查询。例如:

THROW 50001, 'Test', 1;

消息 50001,第 16 级,状态 1,第 1 行

测试


更多信息

SELECT @@VERSION 产生这个:

Microsoft SQL Server 2016 (RTM-GDR) (KB3194716) - 13.0.1722.0 (X64) 2016 年 9 月 26 日 13:17:23 版权所有 (c) Windows 8.1 Pro 6.3(内部版本)上的 Microsoft Corporation Express Edition(64 位) 9600:)

MSDN 的语法是“SQL Server(从 2008 年开始)”,在撰写本文时,文章已更新 October 19, 2016,这是在 SQL Server 版本 I 发布几个月后跑起来了。

这是怎么回事?

【问题讨论】:

***.com/a/19478462 用于您的参数 【参考方案1】:

文档:

MSDN 声明以下语法:

RAIS错误

你的命令:

RAISEERROR('Test', 20, 1);

总是犯这个错误。该命令不是“引发错误”,而是“引发错误”。我不知道为什么,但我们被它困住了......

【讨论】:

另外; MSDN 声明“对于从 19 到 25 的严重级别,需要 WITH LOG 选项。”。 也不需要正确传递参数吗? @destination-data 我认为提问者可以自己解决严重性问题,一旦他们得到它。我不确定第二条评论是什么意思:RAISERROR('Test', 12, 1); 工作正常 嗨 AakashM。赞成你的好答案。只是想指出当严重性高于 19 时,如示例中所示,您不能单独使用 RAISERROR。 RAISERROR('Test', 20, 1); 将失败。 RAISERROR('Test', 20, 1) WITH LOG; 不会。 RaIsError指的是埃及太阳神Ra犯的错误。很容易记住。你是不是建议大家聚在一起为微软买一个元音,这样就可以改成别的了?

以上是关于TSQL Raiserror 语法不正确,遵循 MSD 指南的主要内容,如果未能解决你的问题,请参考以下文章

sqlServer2008升级2016raiserror语法修改工具

错误“关键字 'CONVERT' 附近的语法不正确”

TSQL:外部连接表的计数产生不正确的结果

RAISERROR 的用法(转)

SQL - 分布式或本地事务?

sql server数据库中raiserror函数的用法