Freigeben über


Verarbeiten von Anweisungen, die Meldungen generieren

Die Transact-SQL SET-Anweisungsoptionen STATISTICS TIME und STATISTICS IO werden verwendet, um Informationen abzurufen, die bei der Diagnose von Abfragen mit langer Ausführungsdauer unterstützt werden. Frühere Versionen von SQL Server unterstützen auch die SHOWPLAN-Option zum Analysieren von Abfrageplänen. Eine ODBC-Anwendung kann diese Optionen festlegen, indem sie die folgenden Anweisungen ausführt:

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

Wenn SET STATISTICS TIME oder SET SHOWPLAN AUF ON festgelegt sind, geben SQLExecute und SQLExecDirect SQL_SUCCESS_WITH_INFO zurück, und an diesem Punkt kann die Anwendung die SHOWPLAN- oder STATISTICS TIME-Ausgabe abrufen, indem SIE SQLGetDiagRec aufruft, bis sie SQL_NO_DATA zurückgibt. Jede Zeile der SHOWPLAN-Daten wird im folgenden Format ausgegeben:

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

SQL Server Version 7.0 hat die OPTION SHOWPLAN durch SHOWPLAN_ALL und SHOWPLAN_TEXT ersetzt, die beide als Ergebnismenge und nicht als Satz von Nachrichten ausgegeben werden.

Jede Zeile der STATISTICS TIME-Daten wird im folgenden Format ausgegeben:

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

Die Ausgabe von SET STATISTICS IO ist bis zum Ende eines Resultsets nicht verfügbar. Zum Abrufen der STATISTIK-E/A-Ausgabe ruft die Anwendung SQLGetDiagRec auf, wenn SQLFetch oder SQLFetchScroll SQL_NO_DATA zurückgibt. Die Ausgabe der STATISTICS IO-Option erfolgt in folgendem Format:

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

Verwenden von DBCC-Anweisungen

DBCC-Anweisungen geben Daten als Meldungen, nicht als Resultsets, zurück. SQLExecDirect oder SQLExecute geben SQL_SUCCESS_WITH_INFO zurück, und die Anwendung ruft die Ausgabe durch Aufrufen von SQLGetDiagRec ab, bis sie SQL_NO_DATA zurückgibt.

Beispielsweise gibt die folgende Anweisung SQL_SUCCESS_WITH_INFO zurück:

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

Aufrufe von SQLGetDiagRec geben folgendes zurück:

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."  

Verwenden der Anweisungen PRINT und RAISERROR

Transact-SQL PRINT- und RAISERROR-Anweisungen geben auch Daten zurück, indem SIE SQLGetDiagRec aufrufen. PRINT-Anweisungen führen dazu, dass die AUSFÜHRUNG der SQL-Anweisung SQL_SUCCESS_WITH_INFO zurückgibt, und ein späterer Aufruf von SQLGetDiagRec gibt den SQLState 01000 zurück. Ein RAISERROR mit einem Schweregrad bis einschließlich 10 zeigt dasselbe Verhalten wie PRINT. Ein RAISERROR mit einem Schweregrad von 11 oder höher bewirkt, dass die Ausführung SQL_ERROR zurückgibt, und ein anschließender Aufruf von SQLGetDiagRec gibt SQLState 42000 zurück. Beispielsweise gibt die folgende Anweisung SQL_SUCCESS_WITH_INFO zurück:

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

Das Aufrufen von SQLGetDiagRec gibt Folgendes zurück:

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

Die folgende Anweisung gibt SQL_SUCCESS_WITH_INFO zurück:

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

Das Aufrufen von SQLGetDiagRec gibt Folgendes zurück:

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

Die folgende Anweisung gibt SQL_ERROR zurück:

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

Das Aufrufen von SQLGetDiagRec gibt Folgendes zurück:

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

Der Zeitpunkt des Aufrufens von SQLGetDiagRec ist wichtig, wenn die Ausgabe von PRINT- oder RAISERROR-Anweisungen in einem Resultset enthalten ist. Der Aufruf von SQLGetDiagRec zum Abrufen der PRINT- oder RAISERROR-Ausgabe muss unmittelbar nach der Anweisung erfolgen, die SQL_ERROR oder SQL_SUCCESS_WITH_INFO empfängt. Dies ist einfach, wenn nur eine einzelne SQL-Anweisung ausgeführt wird, wie in den oben stehenden Beispielen. In diesen Fällen gibt der Aufruf von SQLExecDirect oder SQLExecute SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurück, und SQLGetDiagRec kann dann aufgerufen werden. Es ist weniger einfach, wenn Codierungsschleifen die Ausgabe eines Batches von SQL-Anweisungen verarbeiten oder SQL Server gespeicherten Prozeduren ausführen.

In diesem Fall gibt SQL Server ein Resultset für jede SELECT-Anweisung zurück, die in einem Batch oder einer gespeicherten Prozedur ausgeführt wird. Wenn der Batch bzw. die Prozedur PRINT- oder RAISERROR-Anweisungen enthält, ist die Ausgabe dieser Anweisungen mit den Resultsets der SELECT-Anweisungen verschachtelt. Wenn die erste Anweisung im Batch oder der Prozedur eine PRINT- oder RAISERROR-Anweisung ist, gibt SQLExecute oder SQLExecDirect SQL_SUCCESS_WITH_INFO oder SQL_ERROR zurück, und die Anwendung muss SQLGetDiagRec aufrufen, bis sie SQL_NO_DATA zurückgibt, um die PRINT- oder RAISERROR-Informationen abzurufen.

Wenn die PRINT- oder RAISERROR-Anweisung nach einer SQL-Anweisung (z. B. einer SELECT-Anweisung) kommt, werden die PRINT- oder RAISERROR-Informationen zurückgegeben, wenn SQLMoreResultsim Resultset positioniert wird, das den Fehler enthält. SQLMoreResults gibt abhängig vom Schweregrad der Nachricht SQL_SUCCESS_WITH_INFO oder SQL_ERROR zurück. Nachrichten werden durch Aufrufen von SQLGetDiagRec abgerufen, bis SQL_NO_DATA zurückgegeben wird.

Weitere Informationen

Behandlung von Fehlern und Meldungen