SET ANSI_WARNINGS (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

複数のエラー条件に対して ISO 標準の動作をすることを指定します。

Transact-SQL 構文表記規則

構文

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 値が返されます。 ゼロによる割り算や算術オーバーフローエラーでヌル値が返される現象は、文字、Unicode、またはバイナリカラムでINSERTやUPDATEを試みた場合に起こり、新しい値の長さが列の最大サイズを超える場合に発生します。 SET SET ANSI_WARNINGSがオンの場合、ISO規格で規定されたINSERTまたはUPDATEはキャンセルされます。 文字型の列の末尾の空白文字とバイナリ列の末尾の NULL 値は無視されます。 OFF の場合、データは列のサイズに切り捨てられ、ステートメントは成功します。

注意

バイナリまたはヴァリビナリデータへの変換や変換で切断が発生した場合、SETオプションに関わらず警告やエラーは発生しません。

注意

ANSI_WARNINGS ストアドプロシージャやユーザー定義関数のパラメータ渡し、バッチ文で変数を宣言・設定する際には尊重されません。 たとえば、変数を char(3) と定義し、これに 4 文字以上の値を設定すると、データが定義されたサイズに合わせて切り捨てられてから、INSERT または UPDATE ステートメントが成功します。

sp_configureのユーザーオプションを使って、サーバーへのすべての接続でANSI_WARNINGSのデフォルト設定を設定できます。 詳細については、「sp_configure (Transact-SQL)」を参照してください。

ANSI_WARNINGS 計算された列やインデックスビューのインデックスを作成または操作する際は、必ずONでなければなりません。 SET SET ANSI_WARNINGSがOFFの場合、計算された列やインデックスビューにインデックスを持つテーブルのCREATE、UPDATE、INSERT、DELETE文が失敗します。 計算された列にインデックス化されたビューやインデックスを含む必須SETオプション設定の詳細については、SETの「Considerations Using the Statements」をご覧ください。

SQL ServerにはANSI_WARNINGSデータベースオプションが含まれています。 これは、SET ANSI_WARNINGS と同じです。 SET ANSI_WARNINGSがONの場合、ゼロ割り算、データベースの列に大きすぎる文字列など、エラーや警告が発生します。 SET ANSI_WARNINGSがオフの時は、これらのエラーや警告は表示されません。 modelデータベースのSET ANSI_WARNINGSのデフォルト値はOFFです。 指定がなければ、 ANSI_WARNINGS の設定が適用されます。 SET ANSI_WARNINGSがOFFの場合、SQL Serverはsys.databasesのカタログビューのis_ansi_warnings_on列の値を使います。

重要

ANSI_WARNINGS 分散クエリを実行するには、ON に設定する必要があります。

SQL ServerネイティブクライアントのODBCドライバー、SQL ServerネイティブクライアントのOLE DBプロバイダー(SQL Server)、MicrosoftのJDBCドライバ(SQL Server)などのクライアントは、接続フラグとともに自動的にANSI_WARNINGSをONに設定します。 この構成は、ODBC データ ソースまたは ODBC 接続属性で定義され、接続前にアプリケーションで設定できます。 DB-Library アプリケーションからの接続に対しては、SET ANSI_WARNINGS は既定で OFF に設定されています。 詳細については、表形式データ ストリーム (TDS) プロトコル仕様の LOGIN7 を参照してください。

ANSI_DEFAULTSがオンの場合、ANSI_WARNINGSが有効になります。

ANSI_WARNINGSの設定は、解析時ではなく実行時に定義されます。 すべてのステートメントSET、SET ANSI_WARNINGSは現在のセッションに影響を与えます。

SET ARITHABORTまたはSETSET ARITHIGNOREのいずれかがオフでSETSET 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 のメンバーシップが必要です。

以下の例は、前述の3つの状況を示しており、ONとOFFの両 SET ANSI_WARNINGS があります。

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;