SET ANSI_WARNINGS (Transact-SQL)
指定數個錯誤狀況的 ISO 標準行為。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
語法
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,INSERT 或 UPDATE 就會依 ISO 標準的指定加以取消。 字元資料行尾端的空格會被忽略,二進位資料行尾端的 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 包括 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 Server Native Client ODBC 驅動程式和 SQL Server Native Client OLE DB 提供者在連接之時,都會自動將 ANSI_WARNINGS 設為 ON。 在連接之前,您可以在應用程式的 ODBC 資料來源或 ODBC 連接屬性中設定這個項目。 起始於 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 會傳回錯誤訊息。
若要檢視此設定的目前設定,請執行下列查詢。
DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';
SELECT @ANSI_WARN AS ANSI_WARNINGS;
權限
需要 public 角色中的成員資格。
範例
下列範例會示範將 SET ANSI_WARNINGS 設為 ON 和 OFF 的上述三種狀況。
USE AdventureWorks2012;
GO
CREATE TABLE T1
(
a int,
b int NULL,
c varchar(20)
);
GO
SET NOCOUNT ON;
INSERT INTO T1
VALUES (1, NULL, '')
,(1, 0, '')
,(2, 1, '')
,(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