这段代码如何工作?我从未发现使用不带单引号分隔的文本可以工作,但这确实也不应该。也许我发现了 SQL Server 中的一个错误。如果是这样,我会获得奖牌吗?
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Trevor
-- Create date: 20/10/2023
-- Description: Parameter Test
-- =============================================
CREATE OR ALTER PROCEDURE spParameterTest
@a INT
,@b VARCHAR(50)
,@c DATE
AS
BEGIN
SELECT
@a AS a
,@b AS b
,@c AS c
END
GO
和
EXEC spParameterTest
@a = 1
,@b = Trevor
,@c = '2023/10/20'
给出意想不到的结果,如
a|b|c
1|Trevor|2023-10-20
(1 row affected)
预期结果
EXEC spParameterTest
@a = 1
,@b = 0Trevor
,@c = '2023/10/20'
导致这个
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'Trevor'.
但是这个
EXEC spParameterTest
@a = 1
,@b = '0Trevor'
,@c = '2023/10/20'
给出
a|b|c
1|0Trevor|2023-10-20
(1 row affected)
正如预期的那样。
最佳答案
SQL Server 将不带引号的字符串解析为标识符,如果有效,则使用该值作为过程参数值。这可以通过以下方式观察:
EXEC spParameterTest
@a = 1
,@b = StringOf128Charactersxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
,@c = '2023-10-20';
上面的结果是过程成功执行,并且值被截断为 50 个字符。
传递更长的值:
EXEC spParameterTest
@a = 1
,@b = StringOf129Charactersxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
,@c = '2023-10-20';
导致以下错误。请注意错误消息中的“标识符”一词。
Msg 103, Level 15, State 4, Line 233 The identifier that starts with 'StringOf129Charactersxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' is too long. Maximum length is 128.
关于sql - 这个过程如何在不引用传递的参数值的情况下执行工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77329684/