メッセージを生成するステートメントの処理

適用対象:SQL ServerAzure SQL データベースAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Transact-SQL SET 文オプション STATISTICS TIME と STATISTICS IO は、長期クエリの診断に役立つ情報を得るために使われます。 以前のバージョンの SQL Server では、クエリ プランを分析するための SHOWPLAN オプションもサポートされています。 ODBC アプリケーションでは、次のステートメントを実行してこれらのオプションを設定できます。

SQLExecDirect(hstmt, "SET SHOWPLAN ON", SQL_NTS);  
SQLExecDirect(hstmt, "SET STATISTICS TIME ON", SQL_NTS90  
);  
SQLExecDirect(hstmt, "SET STATISTICS IO ON", SQL_NTS);  

SHOWPLANがSETSET STATISTICS TIMEまたはSETオンのとき、SQLExecuteSQLExecDirectがSQL_SUCCESS_WITH_INFOを返し、その時点でアプリケーションはSQLGetDiagRecを呼び出してSHOWPLANやSTATISTICS TIME出力を取り戻し、SQL_NO_DATAを返すことができます。 SHOWPLAN データの各行は、次の形式で返されます。

szSqlState="01000", *pfNativeError=6223,  
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]   
              Table Scan"  

バージョン7.0 SQL Server SHOWPLANオプションをSHOWPLAN_ALLとSHOWPLAN_TEXTに置き換え、どちらもメッセージのセットではなく結果セットとして出力を返します。

各 STATISTICS TIME 行は次の形式に戻ってきます:

szSqlState="01000", *pfNativeError= 3613,  
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]  
   SQL Server Parse and Compile Time: cpu time = 0 ms."  

SET SET STATISTICS IOの出力は結果集合の終わりまで利用できません。 出力 STATISTICS IO を得るために、アプリケーションは SQLGetDiagRecをSQLFetDiagRec 呼び出し、 SQLFetch または SQLFetchScroll がSQL_NO_DATAを返します。 STATISTICS IOの出力は次のフォーマットで戻ってきます:

szSqlState="01000", *pfNativeError= 3615,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   Table: testshow  scan count 1,  logical reads: 1,  
   physical reads: 0."  

DBCC ステートメントの使用

DBCC ステートメントは、結果セットではなく、メッセージとしてデータを返します。 SQLExecDirect または SQLExecute はSQL_SUCCESS_WITH_INFOを返し、アプリケーションはSQL_NO_DATAを返すまで SQLGetDiagRec を呼び出して出力を取得します。

たとえば、次のステートメントでは SQL_SUCCESS_WITH_INFO が返されます。

SQLExecDirect(hstmt, "DBCC CHECKTABLE(Authors)", SQL_NTS);  

SQLGetDiagRec の呼び出しは次を返します。

szSqlState = "01000", *pfNativeError = 2536,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   Checking authors"  
szSqlState = "01000", *pfNativeError = 2579,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   The total number of data pages in this table is 1."  
szSqlState = "01000", *pfNativeError = 7929,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   Table has 23 data rows."  
szSqlState = "01000", *pfNativeError = 2528  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   DBCC execution completed. If DBCC printed error messages,  
   see your System Administrator."  

PRINT ステートメントと RAISERROR ステートメントの使用

Transact-SQL PRINT および RAISERROR ステートメントも、 SQLGetDiagRec を呼び出すことによってデータを返します。 PRINT ステートメントを実行すると、SQL ステートメントの実行はSQL_SUCCESS_WITH_INFOを返し、その後 SQLGetDiagRec を呼び出すと、 SQLState 01000 が返されます。 重大度が 10 以下の RAISERROR の動作は PRINT と同様です。 重大度が 11 以上の RAISERROR を指定すると、実行はSQL_ERRORを返し、以降 SQLGetDiagRec を呼び出すと、 SQLState 42000 が返されます。 たとえば、次のステートメントでは SQL_SUCCESS_WITH_INFO が返されます。

SQLExecDirect (hstmt, "PRINT  'Some message' ", SQL_NTS);  

SQLGetDiagRec を呼び出すと、次の結果が返されます。

szSQLState = "01000", *pfNative Error = 0,  
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]  
   Some message"  

次のステートメントからは、SQL_SUCCESS_WITH_INFO が返されます。

SQLExecDirect (hstmt, "RAISERROR ('Sample error 1.', 10, -1)",  
   SQL_NTS)  

SQLGetDiagRec を呼び出すと、次の結果が返されます。

szSQLState = "01000", *pfNative Error = 50000,  
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]  
   Sample error 1."  

次のステートメントからは、SQL_ERROR が返されます。

SQLExecDirect (hstmt, "RAISERROR ('Sample error 2.', 11, -1)", SQL_NTS)  

SQLGetDiagRec を呼び出すと、次の結果が返されます。

szSQLState = "42000", *pfNative Error = 50000,  
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]  
   Sample error 2."  

PRINT ステートメントまたは RAISERROR ステートメントからの出力が結果セットに含まれている場合、 SQLGetDiagRec を呼び出すタイミングは非常に重要です。 PRINT または RAISERROR 出力を取得する SQLGetDiagRec の呼び出しは、SQL_ERRORまたはSQL_SUCCESS_WITH_INFOを受け取るステートメントの直後に行う必要があります。 この操作は、上記の例のように、1 つの SQL ステートメントのみを実行するときは容易に実行できます。 このような場合、 SQLExecDirect または SQLExecute を呼び出すと、SQL_ERRORまたはSQL_SUCCESS_WITH_INFOが返され、 SQLGetDiagRec を呼び出すことができます。 SQL ステートメントのバッチの出力を処理するループをコーディングする場合や、SQL Server ストアド プロシージャを実行する場合は、簡単ではありません。

この場合、SQL Server は、バッチまたはストアド プロシージャで実行されるすべての SELECT ステートメントの結果セットを返します。 バッチまたはプロシージャに PRINT ステートメントまたは RAISERROR ステートメントが含まれている場合、これらのステートメントの出力は SELECT ステートメントの結果セットと交互に返されます。 バッチまたはプロシージャの最初のステートメントが PRINT または RAISERROR の場合、 SQLExecute または SQLExecDirect はSQL_SUCCESS_WITH_INFOまたはSQL_ERRORを返し、アプリケーションは PRINT または RAISERROR 情報を取得するためにSQL_NO_DATAを返すまで SQLGetDiagRec を呼び出す必要があります。

PRINT ステートメントまたは RAISERROR ステートメントが SQL ステートメント (SELECT ステートメントなど) の後にある場合は、エラーを含む結果セットの位置SQLMoreResultsするときに PRINT または RAISERROR 情報が返されます。 SQLMoreResults は、メッセージの重大度に応じてSQL_SUCCESS_WITH_INFOまたはSQL_ERRORを返します。 メッセージは、SQL_NO_DATAを返すまで SQLGetDiagRec を呼び出すことによって取得されます。

参照

エラーとメッセージの処理