2016-11-15 25 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語句問題的正確方法。