Condividi tramite


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.

Vedi anche

Gestione di errori e messaggi