SET ANSI_WARNINGS (Transact-SQL)

複数のエラー条件に対する SQL-92 の標準動作を指定します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SET ANSI_WARNINGS { ON | OFF }

解説

SET ANSI_WARNINGS は、次の条件に影響します。

  • ON に設定した場合、SUM、AVG、MAX、MIN、STDEV、STDEVP、VAR、VARP、COUNT などの集計関数に NULL 値が含まれていると、警告メッセージが生成されます。OFF の場合、警告メッセージは生成されません。
  • ON に設定した場合、0 除算や演算オーバーフロー エラーが発生すると、ステートメントはロールバックされエラー メッセージが生成されます。OFF に設定した場合、0 除算や演算オーバーフロー エラーが発生すると、NULL 値が返されます。0 除算や演算オーバーフロー エラーが発生し、NULL 値が返されるのは、INSERT または UPDATE を character、Unicode、または binary のデータ型の列で実行した結果、新しい値が列の最大サイズより長くなった場合です。SET ANSI_WARNINGS が ON の場合、INSERT または UPDATE は SQL-92 標準の指定に従ってキャンセルされます。文字型の列の末尾の空白文字とバイナリ列の末尾の NULL 値は無視されます。OFF の場合、データは列のサイズに切り捨てられ、ステートメントは成功します。
    ms190368.note(ja-jp,SQL.90).gifメモ :
    binary データ型と varbinary データ型の間でデータ変換が行われ、切り捨てが発生した場合は、SET オプションの設定に関係なく警告やエラーは発生しません。
    ms190368.note(ja-jp,SQL.90).gifメモ :
    ストアド プロシージャでパラメータを引き渡す場合や、バッチ ステートメントで変数を宣言または設定する場合、またはユーザー定義関数においては、ANSI_WARNINGS は無視されます。たとえば、変数を char(3) として定義し、3 文字より長い値を指定すると、データは定義されたサイズに切り捨てられ、INSERT または UPDATE ステートメントは成功します。

sp_configureuser 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 2005 には、ANSI_WARNINGS データベース オプションが用意されています。これは、SET ANSI_WARNINGS と同じです。SET ANSI_WARNINGS が ON の場合、0 除算やデータベースの列のサイズを超える文字列、または同様のエラーが発生すると、エラーまたは警告が発生します。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 Native Client ODBC ドライバおよび SQL Native Client OLE DB Provider for SQL Server では、接続時に ANSI_WARNINGS が自動的に ON に設定されます。この構成は、ODBC データ ソースまたは ODBC 接続属性で定義できます。または、接続前にアプリケーションで設定される OLE DB 接続プロパティでも定義できます。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 で 0 除算やオーバーフロー エラーが検出されるとエラー メッセージが返されます。

権限

public ロールのメンバシップが必要です。

次の例では、SET ANSI_WARNINGS が ON の場合と OFF の場合に分けて、上の 3 つの状況を示しています。

USE AdventureWorks;
GO

CREATE TABLE T1 (
   a INT, 
   b INT NULL, 
   c VARCHAR(20)
);
GO

SET NOCOUNT ON

INSERT INTO T1 
VALUES (1, NULL, '');
INSERT INTO T1 
VALUES (1, 0, '');
INSERT INTO T1 
VALUES (2, 1, '');
INSERT INTO T1 
VALUES (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

参照

関連項目

INSERT (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手