没有"@"/字符串文字的SQL Server参数

Eyv*_*ind 2 t-sql sql-server parameters string-literals

今天,一个真正难以追踪的错误在我们的项目中体现出来.

我们有一个触发器,在插入或更新数据时执行某些操作,包括调用多个存储过程,并且程序似乎正常工作.除非它没有.

经过几个小时的发型,我们终于找到了罪魁祸首:在EXEC声明中参数名称前面缺少"@".以下最小示例显示了该问题:

CREATE PROCEDURE EchoString @TheString nvarchar(30)
AS
SELECT @TheString 
GO

declare  @MyString char(10) = 'FooBar!'

exec EchoString @MyString
exec EchoString MyString -- Why does this work?
Run Code Online (Sandbox Code Playgroud)

现在,这让我想知道:允许这个的目的是什么?它只是为了向后兼容,还是有合法的用例?是否记录在某处(我的微弱的谷歌搜索显示为空白,但"@"并不是谷歌所能完成的.)

Aar*_*and 6

在某些情况下,SQL Server会将此类参数解释为字符串.最着名的例子:

EXEC sp_who2 active;
Run Code Online (Sandbox Code Playgroud)

是相同的:

EXEC sp_who2 'active';
Run Code Online (Sandbox Code Playgroud)

我不知道这种行为是否有记录,但这样编写代码肯定是脆弱的恕我直言.