gpt4 book ai didi

sql-server - 为什么当我忘记传递过程参数的变量上的@时,SQL会出错?

转载 作者:行者123 更新时间:2023-12-02 23:21:38 25 4
gpt4 key购买 nike

我在使用变量时犯了一个拼写错误,漏掉了一个@。通常 SQL 会提示未声明的变量。然而,在使用 sproc 参数的情况下,sql server 不会提示。它只是推断一些单引号并继续。

谁能解释为什么示例 C 没有错误?

--Ex A. Error
SELECT id

--Ex B. Error
CREATE FUNCTION dbo.fnTest (
@id NVARCHAR(4)
) RETURNS NVARCHAR(4) AS BEGIN
RETURN @id
END
GO
DECLARE @id NVARCHAR(4)
SET @id= 'bob'
SELECT dbo.fnTest(@id) --missing my @, this should be @id
--SELECT dbo.fnTest(id) --missing my @, this should be @id
GO
DROP FUNCTION fnTest

--Ex C. No Error
CREATE PROC spTest (
@id NVARCHAR(4)
) AS
SELECT @id
GO
DECLARE @id NVARCHAR(4)
SET @id= 'bob'
EXEC spTest id --missing my @, this should be @id
GO
DROP PROC spTest

最佳答案

同样的原因,这一直有效:

EXEC sp_who2 active;

与预期相比:

EXEC sp_who2 N'active';

存储过程能够接受不带单引号的输入字符串,并且仍然将其视为字符串,只要它不包含空格或破折号等任何特殊字符。

为什么它适用于过程而不适用于函数?

怀疑你会得到这个问题的令人满意的答案,除非你能找到从事 SQL Server 早期版本(嗯,可能是 Sybase)工作的开发人员,并给他们买杯啤酒并哄骗他们。只是其中一个小实现细节,“这就是它的工作方式;没有为什么”。这两个代码路径很可能是由不同的开发人员编写的,当时发布日期优先于一致性。 (哦,等一下。)

<小时/>

PS 你应该总是命名你的参数,并且 you should always use the schema prefix when creating or referencing objects ,例如

EXEC dbo.spTest @id = @id;

这可以防止您遇到拼写错误,还可以保护您免受对存储过程的潜在更改(例如,有人在参数列表的开头添加了新的可选参数)。

关于sql-server - 为什么当我忘记传递过程参数的变量上的@时,SQL会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20550665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com