SQL SERVER的聯機叢書的解釋:
「當 SET QUOTED_IDENTIFIER 爲 ON 時,標識符能夠由雙引號分隔,而文字必須由單引號分隔。當 SET QUOTED_IDENTIFIER 爲 OFF 時,標識符不可加引號,且必須遵照全部 Transact-SQL 標識符規則。」
先說說什麼是標識符,舉個例子,若是建立了一個叫作USER的數據庫表,則直接用SQL語句「SELECT * FROM USER」作查詢時會報錯:「在關鍵字 'USER' 附近有語法錯誤。」,也就是USER被視做SQL SERVER的關鍵字處理了,而不是被認爲是一個表或視圖。但若是修改成「SELECT * FROM [USER]」就沒問題了。此處的方括號就是標識符。標識符的做用就是告訴數據庫引擎,此處是一個數據庫對象(好比是一個表、視圖、存儲過程等),而不是一個關鍵字。
在SQL SERVER中,方括號是標識符,但不單單是方括號能夠作標識符。在特定的狀況下,雙引號也能夠作標識符,也就是前面的sql語句能夠修改成「SELECT * FROM "USER"」,而這個特定的狀況也就是SET QUOTED_IDENTIFIER ON的狀況下。當SET QUOTED_IDENTIFIER值爲ON時,雙引號內的字符被看成是數據庫對象。而在其值爲OFF時,雙引號被解釋爲字符串的邊界,和單引號的做用是相似的。好比以下幾組SQL 語句都是正確的(假設USER表有一個U_NAME的varchar型的字段)
SET QUOTED_IDENTIFIER ON
SELECT * FROM "USER" WHERE U_NAME='netasp'
SET QUOTED_IDENTIFIER ON
SELECT * FROM [USER] WHERE U_NAME='netasp'
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME="netasp"
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME='netasp'
如今剩下最後一個小問題了,SQL SERVER聯機叢書說OFF是SET QUOTED_IDENTIFIER的默認值,那若是咱們省略掉SET QUOTED_IDENTIFIER語句和寫了SET QUOTED_IDENTIFIER OFF應該效果一致纔對,但事實證實省略掉SET QUOTED_IDENTIFIER語句和SET QUOTED_IDENTIFIER ON語句纔是一致的,這又是爲何呢?原來在默認狀況下,鏈接到 SQL Server 時,ODBC 和 OLE DB 客戶端發出鏈接級 SET 語句,將 QUOTED_IDENTIFIER 設置爲 ON。而鏈接級設置(使用 SET 語句設置)會替代 QUOTED_IDENTIFIER 的默認數據庫設置。原來如此!!!sql