今天,我们的项目中出现了一个非常难以追踪的错误。
我们有一个触发器,它在插入或更新数据时执行某些操作,包括调用几个存储过程,并且程序似乎工作正常。除非它没有。
经过数小时的梳理,我们终于找到了罪魁祸首:在 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?
现在,这让我想知道:允许这样做的目的是什么?它只是为了向后兼容,还是有合法的用例?它是否记录在某处(我微弱的谷歌搜索变成了空白,但“@”并不是谷歌的全部。)