Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 何时/为什么要使用QUOTENAME?_Sql Server_String - Fatal编程技术网

Sql server 何时/为什么要使用QUOTENAME?

Sql server 何时/为什么要使用QUOTENAME?,sql-server,string,Sql Server,String,我知道QUOTENAME函数可以用于添加方括号(默认行为)或其他字符包装器。QUOTENAME不适用于较长的字符串(超过128个字符)。所以我的问题是,为什么/什么时候会使用它而不是更传统、更容易阅读的字符串连接。为什么不在术语的开头和结尾连接一个引号或方括号,并使用此函数呢 它是专门为引用列/表/数据库名称而设计的–系统名称。例如,此:SELECT QUOTENAME('abc[]def')返回[abc[]def],而SELECT'['+'abc[]def'+']'返回的[abc[]def]不

我知道QUOTENAME函数可以用于添加方括号(默认行为)或其他字符包装器。QUOTENAME不适用于较长的字符串(超过128个字符)。所以我的问题是,为什么/什么时候会使用它而不是更传统、更容易阅读的字符串连接。为什么不在术语的开头和结尾连接一个引号或方括号,并使用此函数呢

它是专门为引用列/表/数据库名称而设计的–系统名称。例如,此:
SELECT QUOTENAME('abc[]def')
返回
[abc[]def]
,而
SELECT'['+'abc[]def'+']'
返回的
[abc[]def]
不能用作列/表/数据库名称

此外,SQL-99标准将使用单引号字符进行引用,虽然当前版本的SQL Server继续使用括号,但将来可能(或可配置为)使用SQL-99标准。在这种情况下,所有使用QUOTENAME的代码都将继续正常工作,而尝试自行转义的代码将失败


还有更微妙的含义。由于QUOTENAME与sysname具有完全相同的限制,如果Microsoft决定将sysname更改为超过128个字符(256个可能?32767个可能?),则假定QUOTENAME也能够处理这些增加的大小。使用QUOTENAME是从可能不受信任的源获取列名并将其用作系统名的一种安全(r)方法,无论当前/未来的数据库设置如何,都不必担心边缘情况(如输入中的“]或“),也不必担心是否允许字符串从列名中突破以创建SQL注入攻击。我可能不会仅仅依靠此功能来实现安全性,而是将其用于许多保护层中的一层。

QuoteName主要是为类似SYSNAME的数据类型而设计的。此sysname数据类型是128个字符的unicode,即NVARCHAR(128)。因此,如果超过128个字符,则需要使用传统的连接方式。但是我们可以对varchar、nvarchar和sysname数据类型使用QUOTENAME

declare @test NVARCHAR(1000) = replicate('a',500)
declare @testsysname sysname = replicate('a',500)

select QUOTENAME(@test) -- this returns null
select QUOTENAME(@testsysname) --this displays only for 128 character with brackets

您主要在需要构建动态sql时使用
QUOTENAME()
。动态SQL是您应该尽可能避免的,但在极少数情况下,它可能是解决问题的最佳方法。在构建动态SQL时,
QUOTENAME()
是确保可能包含空格等不需要的字符的表名和列名变量不会对最终SQL语句造成问题的正确方法。

QUOTENAME在转义字符串时使用的机制周围添加了一定级别的封装。例如,如果在Sql的未来版本中,Microsoft可以将默认字符更改为“为了更接近Ansi标准。一个具体的例子说明什么时候连接更糟糕@MartinSmith谢谢Martin,抱歉我在这里研究时没有看到这个。但是我发现你的答案非常有用。这个网站上有很多愚蠢的东西。这是一篇信息量大、教育性强的帖子,在研究中找不到(我写了一个多小时)。非常感谢,我对投票结果感到惊讶!作为旁注,sysname并不总是nvarchar(128)。在SQLServer6.5中,它是varchar(30)。所以它在过去已经改变了。几乎没有理由说它在未来不会再改变。