SET ANSI_WARNINGS (Transact-SQL)
Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス
複数のエラー条件に対して ISO 標準の動作をすることを指定します。
構文
SQL Server、Azure Synapse Analytics のサーバーレス 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 に設定した場合、0 除算や演算オーバーフロー エラーが発生すると、ステートメントはロールバックされエラー メッセージが生成されます。 OFF に設定した場合、0 除算や演算オーバーフロー エラーが発生すると、NULL 値が返されます。 INSERT または UPDATE が character、Unicode、binary 型の列に対して実行され、新しい値の長さが列の最大サイズを超過すると、0 除算や演算オーバーフロー エラーが原因となって NULL 値が返されます。 SET ANSI_WARNINGS が ON の場合、INSERT または UPDATE は ISO 標準の指定に従って取り消されます。 文字型の列の末尾の空白文字とバイナリ列の末尾の NULL 値は無視されます。 OFF の場合、データは列のサイズに切り捨てられ、ステートメントは成功します。
注意
binary データと varbinary データの型変換で切り捨てが発生した場合は、SET オプションの設定に関係なく、警告やエラーは発生しません。
注意
ストアド プロシージャでパラメーターを引き渡す場合や、バッチ ステートメントで変数を宣言または設定する場合、またはユーザー定義関数においては、ANSI_WARNINGS は無視されます。 たとえば、変数を char(3) と定義し、これに 4 文字以上の値を設定すると、データが定義されたサイズに合わせて切り捨てられてから、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 の場合、0 除算やデータベースの列のサイズを超える文字列、または同様のエラーが発生すると、エラーまたは警告が発生します。 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 Native Client OLE DB Provider for SQL Server、および Microsoft JDBC Driver for SQL Server などのクライアントでは、接続フラグで ANSI_WARNINGS が自動的にオンに設定されます。 この構成は、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 で 0 除算やオーバーフロー エラーが検出されるとエラー メッセージが返されます。
この設定の現在の設定を表示するには、次のクエリを実行します。
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 の場合に分けて、上の 3 つの状況を示しています。
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;