SET ANSI_WARNINGS (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

指定數個錯誤狀況的 ISO 標準行為。

Transact-SQL 語法慣例

Syntax

Azure Synapse Analytics、Microsoft Fabric 中的 SQL Server 無伺服器 SQL 集區語法

SET ANSI_WARNINGS { ON | OFF }

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的語法

SET ANSI_WARNINGS ON

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

備註

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 時,便會將資料截斷成為資料行大小,陳述式會繼續作業。

注意

在來源或目標是 binaryvarbinary 資料的任何轉換作業中,當發生截斷時,不論 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;