Elaborazione di istruzioni che generano messaggi
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
Le opzioni dell'istruzione TRANSACT-SQL SET STATISTICS TIME e STATISTICS I/O vengono usate per ottenere informazioni utili per la diagnosi di query con esecuzione prolungata. Le versioni precedenti di SQL Server supportano anche l'opzione SHOWPLAN per l'analisi dei piani di query. È possibile impostare queste opzioni in un'applicazione ODBC eseguendo le istruzioni seguenti:
SQLExecDirect(hstmt, "SET SHOWPLAN ON", SQL_NTS);
SQLExecDirect(hstmt, "SET STATISTICS TIME ON", SQL_NTS90
);
SQLExecDirect(hstmt, "SET STATISTICS IO ON", SQL_NTS);
Quando SET STATISTICS TIME o SET SHOWPLAN sono ON, SQLExecute e SQLExecDirect restituiscono SQL_SUCCESS_WITH_INFO e, a quel punto, l'applicazione può recuperare l'output SHOWPLAN o STATISTICS TIME chiamando SQLGetDiagRec fino a quando non restituisce SQL_NO_DATA. Ogni riga di dati SHOWPLAN viene restituita nel formato:
szSqlState="01000", *pfNativeError=6223,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
Table Scan"
SQL Server versione 7.0 ha sostituito l'opzione SHOWPLAN con SHOWPLAN_ALL e SHOWPLAN_TEXT, che restituiscono entrambi l'output come set di risultati, non un set di messaggi.
Ogni riga di dati STATISTICS TIME viene restituita nel formato:
szSqlState="01000", *pfNativeError= 3613,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
SQL Server Parse and Compile Time: cpu time = 0 ms."
L'output di SET STATISTICS IO non è disponibile fino alla fine di un set di risultati. Per ottenere l'output STATISTICS I/O, l'applicazione chiama SQLGetDiagRec al momento in cui SQLFetch o SQLFetchScroll restituisce SQL_NO_DATA. L'output di STATISTICS IO viene restituito nel formato:
szSqlState="01000", *pfNativeError= 3615,
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]
Table: testshow scan count 1, logical reads: 1,
physical reads: 0."
Utilizzo di istruzioni DBCC
Le istruzioni DBCC restituiscono i dati come messaggi, non come set di risultati. SQLExecDirect o SQLExecute restituiscono SQL_SUCCESS_WITH_INFO e l'applicazione recupera l'output chiamando SQLGetDiagRec finché non restituisce SQL_NO_DATA.
Nell'istruzione seguente, ad esempio, viene restituito SQL_SUCCESS_WITH_INFO:
SQLExecDirect(hstmt, "DBCC CHECKTABLE(Authors)", SQL_NTS);
Le chiamate a SQLGetDiagRec restituiscono:
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."
Utilizzo delle istruzioni PRINT e RAISERROR
Le istruzioni Transact-SQL PRINT e RAISERROR restituiscono anche dati chiamando SQLGetDiagRec. Le istruzioni PRINT causano la restituzione di SQL_SUCCESS_WITH_INFO dell'esecuzione dell'istruzione SQL e una chiamata successiva a SQLGetDiagRec restituisce un valore SQLState pari a 01000. Un'istruzione RAISERROR con livello di gravità dieci o inferiore si comporta esattamente come PRINT. Un VALORE RAISERROR con gravità 11 o superiore determina la restituzione di SQL_ERROR da parte dell'esecuzione e una chiamata successiva a SQLGetDiagRec restituisce SQLState 42000. Nell'istruzione seguente, ad esempio, viene restituito SQL_SUCCESS_WITH_INFO:
SQLExecDirect (hstmt, "PRINT 'Some message' ", SQL_NTS);
La chiamata a SQLGetDiagRec restituisce:
szSQLState = "01000", *pfNative Error = 0,
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]
Some message"
Nell'istruzione seguente, ad esempio, viene restituito SQL_SUCCESS_WITH_INFO:
SQLExecDirect (hstmt, "RAISERROR ('Sample error 1.', 10, -1)",
SQL_NTS)
La chiamata a SQLGetDiagRec restituisce:
szSQLState = "01000", *pfNative Error = 50000,
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]
Sample error 1."
L'istruzione seguente restituisce SQL_ERROR:
SQLExecDirect (hstmt, "RAISERROR ('Sample error 2.', 11, -1)", SQL_NTS)
La chiamata a SQLGetDiagRec restituisce:
szSQLState = "42000", *pfNative Error = 50000,
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]
Sample error 2."
L'intervallo di chiamata di SQLGetDiagRec è fondamentale quando l'output delle istruzioni PRINT o RAISERROR è incluso in un set di risultati. La chiamata a SQLGetDiagRec per recuperare l'output PRINT o RAISERROR deve essere eseguita immediatamente dopo l'istruzione che riceve SQL_ERROR o SQL_SUCCESS_WITH_INFO. Si tratta di un processo diretto quando viene eseguita una sola istruzione SQL, come negli esempi precedenti. In questi casi, è possibile chiamare la chiamata a SQLExecDirect o SQLExecute SQL_ERROR o SQL_SUCCESS_WITH_INFO e SQLGetDiagRec. È meno semplice quando i cicli di codifica gestiscono l'output di un batch di istruzioni SQL o quando si eseguono stored procedure di SQL Server.
In questo caso, SQL Server restituisce un set di risultati per ogni istruzione SELECT eseguita in un batch o in una stored procedure. Se il batch o la stored procedure contiene le istruzioni PRINT o RAISERROR, il relativo output viene interfacciato con il set di risultati dell'istruzione SELECT. Se la prima istruzione nel batch o nella routine è print o RAISERROR, SQLExecute o SQLExecDirect restituisce SQL_SUCCESS_WITH_INFO o SQL_ERROR e l'applicazione deve chiamare SQLGetDiagRec finché non restituisce SQL_NO_DATA per recuperare le informazioni PRINT o RAISERROR.
Se l'istruzione PRINT o RAISERROR viene eseguita dopo un'istruzione SQL,ad esempio un'istruzione SELECT, le informazioni PRINT o RAISERROR vengono restituite quando SQLMoreResults posiziona sul set di risultati contenente l'errore. SQLMoreResults restituisce SQL_SUCCESS_WITH_INFO o SQL_ERROR a seconda della gravità del messaggio. I messaggi vengono recuperati chiamando SQLGetDiagRec fino a quando non restituisce SQL_NO_DATA.