SET ANSI_WARNINGS (Transact-SQL)
指定許多錯誤狀況的 SQL-92 標準行為。
語法
SET ANSI_WARNINGS { ON | OFF }
備註
SET ANSI_WARNINGS 會影響下列狀況:
- 當設為 ON 時,如果彙總函數 (如 SUM、AVG、MAX、MIN、STDEV、STDEVP、VAR、VARP 或 COUNT) 中出現 Null 值,就會產生警告訊息。當設為 OFF 時,不會產生警告訊息。
- 當設為 ON 時,除以零和算術溢位錯誤會造成陳述式的回復,且會產生錯誤訊息。當設為 OFF 時,除以零和算術溢位錯誤會造成傳回 Null 值。如果嘗試對新值長度超出資料行大小上限的 character、Unicode 或 binary 資料行執行 INSERT 或 UPDATE,就會發生除以零和算術溢位錯誤造成傳回 Null 值的行為。如果 SET ANSI_WARNINGS 是 ON,就會依照 SQL-92 標準所指定來取消 INSERT 或 UPDATE。字元資料行尾端的空格會被忽略,二進位資料行尾端的 Null 也會被忽略。當它是 OFF 時,便會將資料截斷成為資料行大小,陳述式會繼續作業。
附註: 在來源或目標是 binary 或 varbinary 資料的任何轉換作業中,當發生截斷時,不論 SET 選項為何,都不會發出任何警告或錯誤。 附註: 當在預存程序或使用者自訂函數中傳遞參數時,或在批次陳述式中宣告和設定變數時,會忽略 ANSI_WARNINGS。例如,如果變數定義為 char(3),然後又設為超過 3 個字元的值,就會將資料截斷成定義的大小,INSERT 或 UPDATE 陳述式會繼續運作。
您可以利用 sp_configure 的 user options 選項來設定所有伺服器連接的 ANSI_WARNINGS 預設值。如需詳細資訊,請參閱<sp_configure (Transact-SQL)>或<設定伺服器組態選項>。
當您建立或操作計算資料行索引或索引檢視時,SET ANSI_WARNINGS 也必須是 ON。如果 SET ANSI_WARNINGS 是 OFF,含計算資料行索引的資料表或索引檢視之 CREATE、UPDATE、INSERT 和 DELETE 陳述式會失敗。如需有關含索引檢視和計算資料行索引之必要 SET 選項設定的詳細資訊,請參閱<SET (Transact-SQL)>中的「使用 SET 陳述式時的考量」一節。
SQL Server 2005 包括 ANSI_WARNINGS 資料庫選項。這相當於 SET ANSI_WARNINGS。當 SET ANSI_WARNINGS 是 ON 時,會在除以零、資料庫資料行的字串太大及其他類似的錯誤中,產生錯誤或警告。當 SET ANSI_WARNINGS 是 OFF 時,不會產生這些錯誤和警告。model 資料庫中的 SET ANSI_WARNINGS 預設值是 OFF。若未指定,就會套用 ANSI_WARNINGS 的設定。如果 SET ANSI_WARNINGS 是 OFF,SQL Server 會使用 sys.databases 目錄檢視中的 is_ansi_warnings_on 資料行值。如需詳細資訊,請參閱<設定資料庫選項>。
ANSI_WARNINGS 應該設為 ON,以便執行分散式查詢。
SQL Server 的 SQL Native Client ODBC 驅動程式和 SQL Native Client OLE DB 提供者在連接之時,都會將 ANSI_WARNINGS 設為 ON。在連接之前,您可以在應用程式的 ODBC 資料來源、ODBC 連接屬性或 OLE DB 連接屬性集中設定這個項目。起始於 DB-Library 應用程式的連接之 SET ANSI_WARNINGS 預設值是 OFF。
當 SET ANSI_DEFAULTS 是 ON 時,會啟用 SET ANSI_WARNINGS。
SET ANSI_WARNINGS 的設定是在執行階段進行設定,而不是在剖析階段進行設定。
如果 SET ARITHABORT 或 SET ARITHIGNORE 是 OFF,而 SET ANSI_WARNINGS 是 ON,當發現除以零或溢位的錯誤時,SQL Server 會傳回錯誤訊息。
權限
需要 public 角色中的成員資格。
範例
下列範例會示範將 SET ANSI_WARNINGS 設為 ON 和 OFF 的上述三種狀況。
USE AdventureWorks;
GO
CREATE TABLE T1 (
a INT,
b INT NULL,
c VARCHAR(20)
);
GO
SET NOCOUNT ON
INSERT INTO T1
VALUES (1, NULL, '');
INSERT INTO T1
VALUES (1, 0, '');
INSERT INTO T1
VALUES (2, 1, '');
INSERT INTO T1
VALUES (2, 2, '');
SET NOCOUNT OFF;
GO
PRINT '**** Setting ANSI_WARNINGS ON';
GO
SET ANSI_WARNINGS ON;
GO
PRINT 'Testing NULL in aggregate';
GO
SELECT a, SUM(b)
FROM T1
GROUP BY a;
GO
PRINT 'Testing String Overflow in INSERT';
GO
INSERT INTO T1
VALUES (3, 3, 'Text string longer than 20 characters');
GO
PRINT 'Testing Divide by zero';
GO
SELECT a / b AS ab
FROM T1;
GO
PRINT '**** Setting ANSI_WARNINGS OFF';
GO
SET ANSI_WARNINGS OFF;
GO
PRINT 'Testing NULL in aggregate';
GO
SELECT a, SUM(b)
FROM T1
GROUP BY a;
GO
PRINT 'Testing String Overflow in INSERT';
GO
INSERT INTO T1
VALUES (4, 4, 'Text string longer than 20 characters');
GO
SELECT a, b, c
FROM T1
WHERE a = 4;
GO
PRINT 'Testing Divide by zero';
GO
SELECT a / b AS ab
FROM T1;
GO
DROP TABLE T1
請參閱
參考
INSERT (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)