我知道QUOTENAME函数可以用来添加方括号(默认行为)或其他字符包装。 QUOTENAME不适用于更长的字符串(超过128个字符)。所以我的问题是,为什么/何时使用它而不是更常规和更容易读取的字符串连接。为什么不只是在一个词的开始和结尾连接一个单引号或一个方括号,而是使用这个函数呢?何时/为什么要使用QUOTENAME?
回答
它是专为引用列/表/数据库名称 - 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注入攻击。我可能不会仅仅依靠这个特性来实现安全性,而是将其用于多层保护之一。
在这个网站这么多愚蠢。这是一个非常翔实和教育(我已经用了一个多小时)没有发现这个帖子,非常感谢,我对这个downvote感到惊讶! – LearnByReading
作为一个附注,sysname并不总是nvarchar(128)。在Sql Server 6.5,它是varchar(30),所以它在过去已经发生了变化,很少有理由在未来不能再改变。 –
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
您使用QUOTENAME()
主要是当你需要建立动态SQL。尽可能避免动态SQL,但在极少数情况下,它可能是解决问题的最佳方法。构建动态SQL时,QUOTENAME()
是确保表和列名变量可以包括像空格不想要的字符不会造成最终的SQL语句问题的正确方法。
- 1. 为什么我们应该使用QUOTENAME函数?
- 2. 为什么我需要使用超时?
- 3. 使用dispatcher.BeginInvoke时,何时/为什么需要调用Dispatcher.Run?
- 4. 为什么要使用Windows.Forms.Timer?
- 5. 为什么要使用Mockito?
- 6. 为什么要使用Django?
- 7. 为什么要使用DataTemplate.DataType
- 8. 为什么要使用PortletURL?
- 9. 为什么要使用Querydsl?
- 10. 为什么要使用CAssetManager?
- 11. 为什么要使用Socket.io?
- 12. 为什么要使用ActionbarSherlock?
- 13. 为什么要使用CC_BREAK_IF?
- 14. 为什么要使用File.join()?
- 15. 为什么要使用fluentmigrator?
- 16. 为什么要使用Asprintf?
- 17. 为什么要使用DialogFragment?
- 18. 为什么要使用restartLoader()?
- 19. 为什么要使用Dispatcher.BeginInvoke?
- 20. 为什么要使用jsp:forward
- 21. 为什么要使用Uploadify?
- 22. 为什么要使用Hashtable.Synchronized?
- 23. 为什么要使用scala.collection.immutable.Stack
- 24. 为什么要使用addscalar?
- 25. 为什么我需要Iterator接口,为什么要使用它?
- 26. 什么时候和为什么要使用战略模式?
- 27. 我什么时候需要使用Bigarray,为什么?
- 28. 什么时候/为什么要使用自定义例外
- 29. 为什么要使用-T使用ssh
- 30. 为什么要使用线程时需要子进程
Quotename在用于转义字符串的机制周围增加了一层封装。例如。如果在SQL微软的未来版本可能更改默认的字符为“对齐接近ANSI标准。 – StuartLC
当串联是糟糕的http://stackoverflow.com/questions/39919037/why-we-should-use一个具体的例子-quotename功能/ 39919122#39919122 –
@MartinSmith感谢马丁,对不起,我没有看到一个,而研究在这里。但是我发现你的答案也非常有用。 – LearnByReading