SET QUOTED_IDENTIFIER {ON|OFF}和SET ANSI_NULLS {ON | OFF}

SET ANSI_NULLS {ON | OFF}
註釋
SQL-92 標準要求對空值的等於 (=) 或不等於 (<>) 比較取值爲 FALSE。當 SET ANSI_NULLS 爲 ON 時,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 語句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 語句仍返回零行。
當 SET ANSI_NULLS 爲 OFF 時,等於 (=) 和不等於 (<>) 比較運算符不遵從 SQL-92 標準。使用 WHERE column_name = NULL 的 SELECT 語句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 語句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 語句返回所有非 XYZ 值和非 NULL的行。

 

SET QUOTED_IDENTIFIER {ON|OFF}

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 的默認數據庫設置。原來如此!!!

 

發佈了26 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章