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

时间:2013-08-12 12:57:43

标签: sql-server tsql 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?

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

1 个答案:

答案 0 :(得分:6)

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

EXEC sp_who2 active;

与:

相同
EXEC sp_who2 'active';

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