程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL中set ansi

SQL中set ansi

編輯:關於SqlServer
 

SET ANSI_NULLS 
指定在對空值使用等於 (=) 和不等於 ( <>) 比較運算符時,這些運算符的 SQL-92 遵從行為。

語法 
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的行。


說明 Microsoft? SQL Server? 是將空字符串解釋為單個空格還是真正的空字符串,取決於 sp_dbcmptlevel 的兼容級別設置。如果兼容級別小於或等於 65,SQL Server 就將空字符串解釋為單個空格。如果兼容級別等於 70,則 SQL Server 將空字符串解釋為空字符串。有關更多信息,請參見 sp_dbcmptlevel。


當 SET ANSI_NULLS 為 ON 時,所有對空值的比較均取值為 UNKNOWN。當 SET ANSI_NULLS 為 OFF 時,如果數據值是 NULL,則所有數據對空值的比較將取值為 TRUE。如果未指定,則應用當前數據庫的 ANSI nulls 選項的設置。有關 ANSI nulls 數據庫選項的更多信息,請參見 sp_dboption 和設置數據庫選項。

為使腳本按預期運行,不管 ANSI nulls 數據庫選項或 SET ANSI_NULLS 的設置是什麼,在可能包含空值的比較中使用 IS NULL 和 IS NOT NULL。

對於存儲過程,SQL Server 使用最初創建存儲過程時的 SET ANSI_NULLS 設置值。無論隨後何時執行存儲過程,SET ANSI_NULLS 的設置都還原為其最初使用的值並生效。當在存儲過程內喚醒調用 SET ANSI_NULLS 時,其設置不更改。

在執行分布式查詢時應將 SET ANSI_NULLS 設置為 ON。

在計算列或索引視圖上創建或操作索引時,SET ANSI_NULLS 也必須為 ON。如果 SET ANSI_NULLS 為 OFF,計算列或索引視圖上帶索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 語句將失敗。SQL Server 將返回一個錯誤,列出所有違反所需值的 SET 選項。另外,在執行 SELECT 語句時,如果 SET ANSI_NULLS 為 OFF,則 SQL Server 將忽略計算列或視圖上的索引值並解析選擇,就好象表或視圖上沒有這樣的索引一樣。


說明 ANSI_NULLS 是在處理計算列或索引視圖上的索引時必須設置為所需值的七個 SET 選項之一。還必須將選項 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 設置為 ON,而必須將 NUMERIC_ROUNDABORT 設置為 OFF。


SQL Server ODBC 驅動程序和用於 SQL Server 的 Microsoft OLE DB 提供程序在連接時自動將 ANSI_NULLS 設置為 ON。該設置可以在 ODBC 數據源、ODBC 連接特性或 OLE DB 連接屬性(它們在連接到 SQL Server 之前在應用程序中設置)中進行配置。對來自 DB-Library 應用程序的連接,SET ANSI_NULLS 默認為 OFF。

當 SET ANSI_DEFAULTS 為 ON 時,將啟用 SET ANSI_NULLS。

SET ANSI_NULLS 的設置是在執行或運行時設置,而不是在分析時設置。

權限 
SET ANSI_NULLS 權限默認授予所有用戶。

示例 
下例使用等於 (=) 和不等於 ( <>) 比較運算符對表中的 NULL 值和非空值進行比較。下例還顯示 IS NULL 不受 SET ANSI_NULLS 設置的影響。

-- Create table t1 and insert values. 
CREATE TABLE t1 (a int null) 
INSERT INTO t1 values (NULL) 
INSERT INTO t1 values (0) 
INSERT INTO t1 values (1) 
GO 
-- Print message and perform SELECT statements. 
PRINT 'Testing default setting' 
DECLARE @varname int 
SELECT @varname = NULL 
SELECT * 
FROM t1 
WHERE a = @varname 
SELECT * 
FROM t1 
WHERE a <> @varname 
SELECT * 
FROM t1 
WHERE a IS NULL 
GO 
-- SET ANSI_NULLS to ON and test. 
PRINT 'Testing ANSI_NULLS ON' 
SET ANSI_NULLS ON 
GO 
DECLARE @varname int 
SELECT @varname = NULL 
SELECT * 
FROM t1 
WHERE a = @varname 
SELECT * 
FROM t1 
WHERE a <> @varname 
SELECT * 
FROM t1 
WHERE a IS NULL 
GO 
-- SET ANSI_NULLS to OFF and test. 
PRINT 'Testing SET ANSI_NULLS OFF' 
SET ANSI_NULLS OFF 
GO 
DECLARE @varname int 
SELECT @varname = NULL 
SELECT * 
FROM t1 
WHERE a = @varname 
SELECT * 
FROM t1 
WHERE a <> @varname 
SELECT * 
FROM t1 
WHERE a IS NULL 
GO 
-- Drop table t1. 
DROP TABLE t1 
GO

 

 

 

 

 

SET QUOTED_IDENTIFIER 
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表有一個a的varchar型的字段)

SET QUOTED_IDENTIFIER ON
SELECT * FROM "USER"    WHERE a='netasp' 
SET QUOTED_IDENTIFIER ON
SELECT * FROM [USER] WHERE a='netasp'
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER]    WHERE a="netasp"
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER]    WHERE a= ' 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_IDEN
TIFIER 的默認數據庫設置。原來如此!!!
這些是 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 的行。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved