SET ANSI_WARNINGS (Transact-SQL)
適用於:Microsoft Fabric 中Microsoft網狀架構倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Platform System (PDW) SQL 分析端點
指定數個錯誤狀況的 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
注意
若要檢視 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 時,便會將資料截斷成為資料行大小,陳述式會繼續作業。
注意
在來源或目標是 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;