這些是 SQL-92 設置語句,使 mssql 聽從 SQL-92 規則。
當 SET QUOTED_IDENTIFIER 爲 ON 時
標識符能夠由雙引號分隔,而文字必須由單引號分隔。
當 SET QUOTED_IDENTIFIER 爲 OFF 時
標識符不可加引號。
SQL-92 標準要求在對空值進行等於 (=) 或不等於 (<) 比較時取值爲 FALSE。
當 SET ANSI_NULLS 爲 ON 時
即便 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 語句仍返回零行。
即便 column_name 中包含非空值,使用 WHERE column_name < NULL 的 SELECT 語句仍會返回零行。
等於 (=) 和不等於 (<) 比較運算符不聽從 SQL-92 標準。使用 WHERE column_name = NULL 的 SELECT 語句返回 column_name 中包含空值的行。使用 WHERE column_name < NULL 的 SELECT 語句返回列中包含非空值的行。此外,使用 WHERE column_name < XYZ_value 的 SELECT 語句返回全部不爲 XYZ_value 也不爲 NULL 的行
sql
在sqlserver2005或SQL2008數據庫項目中,建立視圖或存儲過程的時候每每有如下開頭語句:數據庫
這些是 SQL-92 設置語句,使 SQL Server 2000/2005 聽從 SQL-92 規則。
當 SET QUOTED_IDENTIFIER 爲 ON 時,標識符能夠由雙引號分隔,而文字必須由單引號分隔。當 SET QUOTED_IDENTIFIER 爲 OFF 時,標識符不可加引號,且必須符合全部 Transact-SQL 標識符規則。
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_value 也不爲 NULL 的行。sqlserver
SQL Server聯機叢書關於ANSI_NULLS裏有這樣一個代碼示例,給出了直觀的效果,我添加了輸出提示,以下:spa
從上面代碼的運行效果來看:
①當SET ANSI_NULLS ON時, =null或 <> null的查詢條件時,結果都爲空;若是爲 IS NULL 才能顯示NULL的行。
②不對ANSI_NULLS進行設置時,其執行效果與SET ANSI_NULLS ON時的效果一致,此處與SQL-92的要求之一「SQL-92 標準要求對空值的等於 (=) 或不等於 (<>) 比較取值爲 FALSE,是默認值。」衝突哦?!
又怎麼理解這個問題呢?
SQL Server聯機叢書裏ANSI_NULLS的知識文檔裏有答案:「SQL Server ODBC 驅動程序和用於 SQL Server 的 Microsoft OLE DB 提供程序在鏈接時自動將 ANSI_NULLS 設置爲 ON。該設置能夠在 ODBC 數據源、ODBC 鏈接特性或 OLE DB 鏈接屬性(它們在鏈接到 SQL Server 以前在應用程序中設置)中進行配置。」code
PS:其實,實際使用過程當中,咱們並無考慮ANSI_NULLS是被設置爲ON仍是False,咱們對空值的處理都是IS NULL 或者 IS NOT NULLorm