Verarbeiten von Anweisungen, die Meldungen generieren
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Die Transact-SQL SET-Anweisungsoptionen STATISTICS TIME und STATISTICS IO werden verwendet, um Informationen abzurufen, die bei der Diagnose von lang ausgeführten Abfragen helfen. 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 EIN 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 SQLGetDiagRec aufgerufen wird, 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, ersetzte die SHOWPLAN-Option durch SHOWPLAN_ALL und SHOWPLAN_TEXT, die beide die Ausgabe als Resultset zurückgeben, nicht durch eine Reihe von Nachrichten.
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 zum Zeitpunkt der Rückgabe von SQLFetch oder SQLFetchScroll SQL_NO_DATA auf. 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 an SQLGetDiagRec zurückgeben:
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 SQLGetDiagRec aufgerufen wird. PRINT-Anweisungen führen dazu, dass die AUSFÜHRUNG der SQL-Anweisung SQL_SUCCESS_WITH_INFO zurückgibt, und ein anschließender Aufruf von SQLGetDiagRec gibt einen SQLState von 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 nachfolgenden 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."
Die Anzeigedauer 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 zum Verarbeiten der Ausgabe eines Batches von SQL-Anweisungen oder beim Ausführen von gespeicherten SQL Server-Prozeduren ausgeführt werden.
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 ein PRINT- oder RAISERROR-Objekt 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 SQLMoreResults auf dem 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 sie SQL_NO_DATA zurückgibt.