2

今天,我们的项目中出现了一个非常难以追踪的错误。

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

经过数小时的梳理,我们终于找到了罪魁祸首:在 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?

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

4

1 回答 1

6

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

EXEC sp_who2 active;

是相同的:

EXEC sp_who2 'active';

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

于 2013-08-12T13:00:25.930 回答