今天,一个真正难以追查的错误在我们的项目中体现出来。
我们有一个触发器,在插入或更新数据时执行某些操作,包括调用多个存储过程,并且程序似乎正常工作。除非它没有。
经过几个小时的发型,我们终于找到了罪魁祸首:在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?
现在,这让我想知道:允许这个的目的是什么?它只是为了向后兼容,还是有合法的用例?是否记录在某处(我的微弱的谷歌搜索显示为空白,但“@”并不是谷歌所能完成的。)
答案 0 :(得分:6)
在某些情况下,SQL Server会将此类参数解释为字符串。最着名的例子:
EXEC sp_who2 active;
与:
相同EXEC sp_who2 'active';
我不知道这种行为是否有记录,但以这种方式编写代码肯定是脆弱的恕我直言。