TSQL:带引号的标识符转换为参数

TSQL:带引号的标识符转换为参数,tsql,parameters,Tsql,Parameters,引用的标识符作为参数传递时是否隐式转换 这似乎很奇怪,因为它不适用于变量,在查询中,它们的处理方式完全不同 CREATE PROC dbo.TestProc ( @参数nvarchar(10) ) 作为 开始 选择@param 结束 EXEC dbo.TestProc“foo” EXEC dbo.TestProc'foo' 选择“foo” 选择“foo”,因为您将@param定义为nvarchar(10)类型,它只接受单引号引用的值(默认情况下),所以第二个命令(EXEC dbo.TestPr

引用的标识符作为参数传递时是否隐式转换

这似乎很奇怪,因为它不适用于变量,在查询中,它们的处理方式完全不同

CREATE PROC dbo.TestProc
(
@参数nvarchar(10)
)
作为
开始
选择@param
结束
EXEC dbo.TestProc“foo”
EXEC dbo.TestProc'foo'
选择“foo”

选择“foo”
,因为您将@param定义为nvarchar(10)类型,它只接受单引号引用的值(默认情况下),所以第二个命令(EXEC dbo.TestProc“foo”)在默认情况下是正确的。如果没有使用**

将QUOTED_标识符设置为ON(默认为OFF)

**命令,两个单引号(不是双引号)用于转义单引号,如果要使第二个exec命令工作,必须将QUOTED_标识符设置为ON,这允许使用双引号指定字符,这意味着“foo”可以传递给nvarchar(10),并将显示foo(无任何引号)在结果窗口中,因为无论使用单引号还是双引号,sql都会知道哪个部分是要分配给参数的字符值


希望它有助于xD

提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。您还没有识别数据库软件。哇,它甚至可以在sql-server-2014中对
EXEC
调用不加引号的情况下工作,除非文字以数字开头。。。并且它被无声地截断为作为参数大小给定的10 nchars。无论是否有bug,请确保selectlist项与exec调用中的参数值不同。EBNF从未完整发布过,但这可能会有所帮助:vs.这一定是TSQL解析器中的一个缺陷。它在这里接受并强制转换字符串中的几乎任何内容,允许方括号、单引号和双引号作为分隔符,最令人惊讶的是,匹配标识符标准的无引号文本也会出现在字符串中。看不出有什么问题,也看不到如何利用这个漏洞,但请提交一个bug。的设置似乎“有帮助”。更多。试过了,没有变化
EXEC
仍然接受单、双、方括号文本和无引号标记,这些标记看起来像nvarchar(10)参数的标识符(在10.50.1617.0和11.0.6020.0上测试)