为什么RAISERROR拼写错误?还是不是?


70

为什么不RAISERROR拼写RAISEERROR?第二个E在哪里?我可以理解这是否是一些古老的关键字长度限制,但我不希望它是9个字符的限制。

RAIS或RROR是一个技术性词汇,使“ raise-error”只是一种误读吗?(直接的)起源是否使用不同的语言?

我已经搜索过Google,但是在该主题上找不到太多。


12
真正令我困惑的是SSMS的颜色是RAISEERROR粉红色和RAISERROR蓝色。
Dave Cousineau

2
它与loginame中的N约会(由sp_who输出提供),我认为P也试图加入该动作,这要感谢sp_helprotect。
youcantryreachingme

Answers:


18

有趣-老实说,我之前从未注意到过。

我会怀疑这是一个早期的疏忽,但从未纠正过,尽管令我有些惊讶的是,后来没有再为RAISEERROR添加支持,而拼写错误只是为了兼容性。

更新:显然,对于它应该是什么,甚至存在一些内部困惑-请检查此连接请求,尽管MSFT没有响应。


3
有趣的是,他们将其关闭为“不可复制”。我只是点击“连接”页面上的“我可以重现此内容”按钮。
埃里克·J。2010年

4
有趣的是他们删除了它。

2
不幸的是,连接已被弃用,无法找到通过该地址Wayback机器
KyleMit

11

我有一个相同的问题,这就是为什么我偶然发现这篇文章。从我可以看出,实际上是有区别的,并且拼写并不是这两种情况之间唯一的区别。由于用法,这两个功能不相同。

链接和颜色

  • RAISERROR-具有MSDN链接,在SSMS中为青色/蓝色
  • RAISEERROR-我现在找不到的MSDN链接,并且在SSMS中它是洋红色的

应归功于信誉–用户Sahuagin已经在上述问题下的注释中提出了颜色观察。

您正在使用SQL Server 2012吗?
在继续之前,我认为可以断言,如果您使用的是SQL Server 2012或更高版本,请不要使用RAISERRROR!您应该使用THROW

那有什么区别呢?
您可以在单个内联语句中使用RAISERROR(蓝色),而不是使用RAISEERROR(品红色),后者取决于是否包含在不同的代码块中;根据返回的错误。确切的语法错误如下:

“ RAISEERROR”附近的语法不正确。期望进行对话,对话,分配或交易。

RAISERROR示例(一个E-蓝色)

DECLARE @foo varchar(200)
SET @foo = ''

IF NULLIF(@foo, '') IS NULL
BEGIN
    -- To fix this line, remove one "E" to read RAISERROR
    RAISEERROR('Not enough Vespene Gas!', 16, 1);

    RETURN -- This is required otherwise execution will continue!
END

-- You need the RETURN above or this will execute
SELECT Critical_TSqlLine = 1;

这是我执行此代码块时发生的情况。

现在,如果您仅从上面的代码中删除一个“ E”,那将正常工作。我没有提供执行结果,但是如果您打开SSMS并将其放入并执行,我保证它会工作。

RAISEERROR示例(两个E-洋红色)
我花了太多时间试图弄清楚如何使用此版本的函数,但我无法提供一个实际可行的示例。我研究了使用CONVERSATION,DIALOG,DISTRIBUTED或TRANSACTION的方式,但无法使用该语法。长话短说,不用担心这个版本,只使用单个E版本。对于那些使用SQL Server 2012的人来说,这不再是您的烦恼。


我怀疑这是语法突出显示中的一个错字,一些函数名称的表等等,使SSMS认为在实际上没有该名称的函数。
戴夫·库西诺

可能是,我的暗示是它是一个内部函数,从来没有供一般用户使用-就像sp_msforeach一样。我见过他们在内部使用的东西有奇怪的命名约定。
dyslexicanaboko

2
两个E版本实际上不是东西。您只是由于使用标识符文字语法而没有该名称的对象(例如,表)而触发了编译错误……
binki

这确实是一个很长的答案,只是为了说明问题中明确的含义:两个E版本不存在。
Diego Queiroz

10

摘自Jens K. Suessmeyer的关于批处理和存储过程反馈/进度

有没有问过自己,为什么Raiserror中只有一个“ e”?那是从Sybase的旧时代开始的,其中[相同]的两个字符被削减为[一个]。


55
如果是这种情况,那应该不是“ RAISEROR”吗?
CraigW

5

我认为这是故意的,因为它实际上更易于阅读RAISERROR vs RAISEERROR。(有关其他示例,另请参见sp_helprotect),尤其是在没有区分大小写的情况下。

这些东西可以追溯到Sybase的历史。


5

为什么还存在TIMESTAMP数据类型?支持旧版本。Sybase的某个人很久以前就决定将其设置为RAISERROR而不是RAISEERROR,当Microsoft与Sybase达成协议时,他们继续保持这种趋势。


@Ardman,是的,修复了它,我打了很多次,因为RAISERROR我做不到RAISEERROR
KM。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.