我知道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