SET ANSI_WARNINGS (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
指定數個錯誤狀況的 ISO 標準行為。
Syntax
Azure Synapse Analytics 中的 SQL Server 無伺服器 SQL 集區語法,Microsoft Fabric
SET ANSI_WARNINGS { ON | OFF }
Azure Synapse Analytics 和 Analytics Platform System (PDW) 的語法
SET ANSI_WARNINGS ON
備註
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) ,然後設定為大於三個字元的值,資料就會被截斷成定義的大小,而 INSERT 或 UPDATE 陳述式會執行成功。
您可以使用 的 sp_configure
[用戶選項] 選項,為所有連線到伺服器設定ANSI_WARNINGS的預設設定。 如需詳細資訊,請參閱 sp_configure (Transact-SQL)。
當您要建立或操作計算資料行索引或索引檢視表時,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 時,不會產生這些錯誤和警告。 SET ANSI_WARNINGS 資料庫中的 model
預設值為 OFF。 若未指定,就會套用 ANSI_WARNINGS 的設定。 如果 SET ANSI_WARNINGS 是 OFF,SQL Server 會使用 sys.databases 目錄檢視中的 is_ansi_warnings_on 資料行值。
重要
ANSI_WARNINGS 應該設為 ON,以便執行分散式查詢。
用戶端 (例如 SQL Server Native Client ODBC 驅動程式、適用於 SQL Server 的 SQL Server Native Client OLE DB 提供者與適用於 SQL Server 的 Microsoft JDBC 驅動程式) 會自動使用連線旗標將 ANSI_WARNINGS 設定為 ON。 在連接之前,您可以在應用程式的 ODBC 資料來源或 ODBC 連接屬性中設定這個項目。 起始於 DB-Library 應用程式的連接之 SET ANSI_WARNINGS 預設值是 OFF。 如需其他資訊,請參閱表格式資料流 (TDS) 通訊協定規格中的 LOGIN7。
當 ANSI_DEFAULTS 是 ON 時,會啟用 ANSI_WARNINGS。
ANSI_WARNINGS 的設定是在執行時或執行階段進行定義,而不是在剖析階段進行定義。 如同所有 SET 語句,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 的上述三種狀況。
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
現在,將 ANSI_WARNINGS 設定為 ON 並進行測試。
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
現在,將 ANSI_WARNINGS 設定為 OFF 並進行測試。
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;