2016-11-15 22 views
2

我知道QUOTENAME函数可以用来添加方括号(默认行为)或其他字符包装。 QUOTENAME不适用于更长的字符串(超过128个字符)。所以我的问题是,为什么/何时使用它而不是更常规和更容易读取的字符串连接。为什么不只是在一个词的开始和结尾连接一个单引号或一个方括号,而是使用这个函数呢?何时/为什么要使用QUOTENAME?

+0

Quotename在用于转义字符串的机制周围增加了一层封装。例如。如果在SQL微软的未来版本可能更改默认的字符为“对齐接近ANSI标准。 – StuartLC

+1

当串联是糟糕的http://stackoverflow.com/questions/39919037/why-we-should-use一个具体的例子-quotename功能/ 39919122#39919122 –

+0

@MartinSmith感谢马丁,对不起,我没有看到一个,而研究在这里。但是我发现你的答案也非常有用。 – LearnByReading

回答

10

它是专为引用列/表/数据库名称 - sysnames而设计的。例如,如下: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)方式,从可能不受信任的源获取列名并将其作为sysname使用 - 无论当前/将来的数据库设置如何,而不必担心边缘情况(如]或'输入)以及是否允许字符串脱离列名以创建SQL注入攻击。我可能不会仅仅依靠这个特性来实现安全性,而是将其用于多层保护之一。

+0

在这个网站这么多愚蠢。这是一个非常翔实和教育(我已经用了一个多小时)没有发现这个帖子,非常感谢,我对这个downvote感到惊讶! – LearnByReading

+1

作为一个附注,sysname并不总是nvarchar(128)。在Sql Server 6.5,它是varchar(30),所以它在过去已经发生了变化,很少有理由在未来不能再改变。 –

1

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

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 
2

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