次の方法で共有


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

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);  

SET STATISTICS TIME または SET SHOWPLAN が ON の場合、 SQLExecuteSQLExecDirect はSQL_SUCCESS_WITH_INFOを返します。その時点で、アプリケーションは、SQL_NO_DATAを返すまで SQLGetDiagRec を呼び出すことによって SHOWPLAN または STATISTICS TIME 出力を取得できます。 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 STATISTICS IO の出力は、結果セットの最後に到達するまで使用できません。 STATISTICS IO 出力を取得するために、アプリケーションは SQLFetch または SQLFetchScroll がSQL_NO_DATAを返す時点で SQLGetDiagRec を呼び出します。 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 を呼び出すことによって取得されます。

参照

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