SQL Server存储过程未加单引号传参为何能正常执行?
这不是SQL Server的Bug,是标识符解析规则导致的
这并非SQL Server的Bug,而是它对标识符和字符串常量的解析逻辑造成的现象,具体原因如下:
为什么
@b = Trevor能正常执行
当你未加单引号传入Trevor时,SQL Server会首先将其视为合法标识符(符合SQL标识符命名规则:以字母开头,可包含字母、数字、下划线、@、#、$等),尝试查找是否存在同名的变量、对象等。如果找不到匹配的标识符,SQL Server会隐式将其转换为字符串常量,因此能正确传递给VARCHAR类型的参数@b。为什么
@b = 0Trevor会触发语法错误0Trevor不符合SQL Server的标识符命名规则——标识符不能以数字开头(除非用方括号[]或双引号包裹)。此时SQL Server既无法将它识别为合法标识符,它又不是标准的字符串常量(未加单引号),因此直接抛出语法错误。加单引号后正常执行的原因
添加单引号后,'0Trevor'被明确识别为字符串常量,完全符合SQL语法规则,因此能正确传递给参数并执行存储过程。
存储过程代码
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
执行语句及结果
执行语句1(未加单引号传Trevor)
EXEC spParameterTest @a = 1 ,@b = Trevor ,@c = '2023/10/20'
返回结果:
a|b|c 1|Trevor|2023-10-20 (1 row affected)
执行语句2(未加单引号传0Trevor)
EXEC spParameterTest @a = 1 ,@b = 0Trevor ,@c = '2023/10/20'
报错信息:
Msg 102, Level 15, State 1, Line 3 Incorrect syntax near 'Trevor'.
执行语句3(加单引号传0Trevor)
EXEC spParameterTest @a = 1 ,@b = '0Trevor' ,@c = '2023/10/20'
返回结果:
a|b|c 1|0Trevor|2023-10-20 (1 row affected)
内容的提问来源于stack exchange,提问作者TrevorMcComb
相关产品推荐
相关产品推荐

