sql - 这个过程如何在不引用传递的参数值的情况下执行工作?

标签 sql sql-server

这段代码如何工作?我从未发现使用不带单引号分隔的文本可以工作,但这确实也不应该。也许我发现了 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/

相关文章:

sql - 如何使用 JDBC 更新 Oracle Clob

sql - 如何使用 Entity Framework 仅更新一个字段?

sql-server - 每次列值更改时都会更改的运行总计

sql-server - SQL Server 中 mysql "LIMIT "子句的等效语法是什么

php - SQL:OR 语句不起作用

php - 将javascript变量存储在mysql数据库中

sql - 从组中选择满足条件 A 的行。如果不满足,请给我满足条件 B 的行

sql-server - SQL Server : Alter a clustered primary index to an non-clustered

c# - ServiceStack Ormlite OnDelete ="CASCADE"不工作

php - Doctrine 自动将我的文本字段的长度限制为 64512 个字符