Bearbetningsinstruktioner som genererar meddelanden

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

De Transact-SQL SET uttalandealternativ STATISTICS TIME används STATISTICS IO för att få information som hjälper till att diagnostisera långvariga frågor. Tidigare versioner av SQL Server stödjer också SHOWPLAN-alternativet för att analysera frågeplaner. En ODBC-applikation kan ställa in dessa alternativ genom att köra följande satser:

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

När SETSET STATISTICS TIME eller SET SHOWPLAN är PÅ returnerar SQLExecute och SQLExecDirect SQL_SUCCESS_WITH_INFO, och då kan applikationen hämta SHOWPLAN eller STATISTICS TIME utdata genom att anropa SQLGetDiagRec tills den returnerar SQL_NO_DATA. Varje rad SHOWPLAN-data återkommer i formatet:

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

SQL Server version 7.0 ersatte SHOWPLAN-alternativet med SHOWPLAN_ALL och SHOWPLAN_TEXT, som båda returnerar utdata som en resultatuppsättning, inte som en uppsättning meddelanden.

Varje rad av STATISTICS TIME kommer tillbaka i formatet:

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

Utdata av SETSET STATISTICS IO är inte tillgänglig förrän i slutet av en resultatuppsättning. För att få utdata STATISTICS IO anropar applikationen SQLGetDiagRec när SQLFetch eller SQLFetchScroll returnerar SQL_NO_DATA. Utgången av STATISTICS IO kommer tillbaka i formatet:

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

Användning av DBCC-satser

DBCC-satser returnerar sina data som meddelanden, inte som resultatuppsättningar. SQLExecDirect eller SQLExecute returnerar SQL_SUCCESS_WITH_INFO, och applikationen hämtar utdata genom att anropa SQLGetDiagRec tills den returnerar SQL_NO_DATA.

Till exempel återger följande påstående SQL_SUCCESS_WITH_INFO:

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

Anrop till SQLGetDiagRec returnerar:

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

Användning av PRINT- och RAISERROR-satser

Transact-SQL PRINT- och RAISERROR-satser returnerar också data genom att anropa SQLGetDiagRec. PRINT-satser får SQL-satsen att returnera SQL_SUCCESS_WITH_INFO, och ett efterföljande anrop till SQLGetDiagRec returnerar en SQLState på 01000. Ett RAISFEL med en allvarlighetsgrad på tio eller lägre beter sig likadant som PRINT. Ett RAISERROR med allvarlighetsgraden 11 eller högre får exekveringen att returnera SQL_ERROR, och ett efterföljande anrop till SQLGetDiagRec returnerar SQLState 42000. Till exempel återger följande påstående SQL_SUCCESS_WITH_INFO:

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

Anrop av SQLGetDiagRec returnerar:

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

Följande påstående återger SQL_SUCCESS_WITH_INFO:

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

Anrop av SQLGetDiagRec returnerar:

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

Följande påstående återger SQL_ERROR:

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

Anrop av SQLGetDiagRec returnerar:

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

Tidpunkten för att anropa SQLGetDiagRec är avgörande när utdata från PRINT- eller RAISERROR-satser ingår i en resultatuppsättning. Anropet till SQLGetDiagRec för att hämta PRINT- eller RAISERROR-utdata måste göras omedelbart efter satsen som tar emot SQL_ERROR eller SQL_SUCCESS_WITH_INFO. Detta är enkelt när endast en enda SQL-sats exekveras, som i exemplen ovan. I dessa fall returnerar anropet till SQLExecDirect eller SQLExecute SQL_ERROR eller SQL_SUCCESS_WITH_INFO och SQLGetDiagRec kan då anropas. Det är mindre enkelt när man kodar loopar för att hantera utdata från en batch SQL-satser eller när man kör SQL Server-lagrade procedurer.

I detta fall returnerar SQL Server en resultatuppsättning för varje SELECT-sats som körs i en batch eller lagrad procedur. Om batchen eller proceduren innehåller PRINT- eller RAISERROR-satser, blandas utdata för dessa med SELECT-satsens resultatuppsättningar. Om den första satsen i batchen eller proceduren är en PRINT eller RAISERROR, returnerar SQLExecute eller SQLExecDirect SQL_SUCCESS_WITH_INFO eller SQL_ERROR, och applikationen måste anropa SQLGetDiagRec tills den returnerar SQL_NO_DATA för att hämta informationen PRINT eller RAISERROR.

Om PRINT- eller RAISERROR-satsen kommer efter en SQL-sats (såsom en SELECT-sats), returneras PRINT- eller RAISERROR-informationen när SQLMoreResults placerar sig på resultatuppsättningen som innehåller felet. SQLMoreResults returnerar SQL_SUCCESS_WITH_INFO eller SQL_ERROR beroende på meddelandets allvar. Meddelanden hämtas genom att anropa SQLGetDiagRec tills den returnerar SQL_NO_DATA.