次の方法で共有


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

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics 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);  

SET STATISTICS TIME または SET SHOWPLAN が ON の場合、SQLExecute および SQLExecDirect は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"  

SQL Server バージョン 7.0 では、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 を呼び出すことによって取得されます。

参照

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