You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程未加单引号传参为何能正常执行?

这不是SQL Server的Bug,是标识符解析规则导致的

这并非SQL Server的Bug,而是它对标识符和字符串常量的解析逻辑造成的现象,具体原因如下:

  1. 为什么@b = Trevor能正常执行
    当你未加单引号传入Trevor时,SQL Server会首先将其视为合法标识符(符合SQL标识符命名规则:以字母开头,可包含字母、数字、下划线、@、#、$等),尝试查找是否存在同名的变量、对象等。如果找不到匹配的标识符,SQL Server会隐式将其转换为字符串常量,因此能正确传递给VARCHAR类型的参数@b。

  2. 为什么@b = 0Trevor会触发语法错误
    0Trevor不符合SQL Server的标识符命名规则——标识符不能以数字开头(除非用方括号[]或双引号包裹)。此时SQL Server既无法将它识别为合法标识符,它又不是标准的字符串常量(未加单引号),因此直接抛出语法错误。

  3. 加单引号后正常执行的原因
    添加单引号后,'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:25:24