Verwerkingsinstructies voor het genereren van berichten

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

De Transact-SQL SET statementopties STATISTICS TIME en STATISTICS IO worden gebruikt om informatie te verkrijgen die helpt bij het diagnosticeren van langlopende zoekopdrachten. Eerdere versies van SQL Server ondersteunen ook de SHOWPLAN-optie voor het analyseren van queryplannen. Een ODBC-applicatie kan deze opties instellen door de volgende instructies uit te voeren:

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

Wanneer SETSET STATISTICS TIME of SET SHOWPLAN AAN zijn, geven SQLExecute en SQLExecDirect SQL_SUCCESS_WITH_INFO terug, en op dat moment kan de applicatie de SHOWPLAN of STATISTICS TIME output ophalen door SQLGetDiagRec aan te roepen totdat het SQL_NO_DATA teruggeeft. Elke regel SHOWPLAN-data komt terug in het formaat:

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

SQL Server versie 7.0 verving de SHOWPLAN-optie door SHOWPLAN_ALL en SHOWPLAN_TEXT, die beide output teruggeven als een resultaatset, niet als een set berichten.

Elke regel van STATISTICS TIME komt terug in het formaat:

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

De output van SETSET STATISTICS IO is pas beschikbaar aan het einde van een resultaatset. Om output te krijgen STATISTICS IO , roept de applicatie SQLGetDiagRec aan op het moment dat SQLFetch of SQLFetchScroll SQL_NO_DATA teruggeeft. De output van STATISTICS IO komt terug in het formaat:

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

Gebruik van DBCC-instructies

DBCC-instructies geven hun gegevens terug als berichten, niet als resultaatsets. SQLExecDirect of SQLExecute geven SQL_SUCCESS_WITH_INFO terug, en de applicatie haalt de output op door SQLGetDiagRec aan te roepen totdat het SQL_NO_DATA teruggeeft.

Bijvoorbeeld, de volgende stelling geeft SQL_SUCCESS_WITH_INFO terug:

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

Aanroepen naar SQLGetDiagRec geven terug:

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

Gebruik van PRINT- en RAISERROR-instructies

Transact-SQL PRINT- en RAISERROR-instructies geven ook gegevens terug door SQLGetDiagRec aan te roepen. PRINT-instructies zorgen ervoor dat de uitvoering van de SQL-instructie SQL_SUCCESS_WITH_INFO teruggeeft, en een daaropvolgende aanroep naar SQLGetDiagRec geeft een SQLState van 01000 terug. Een RAISERROR met een ernst van tien of lager gedraagt zich hetzelfde als PRINT. Een RAISERROR met een ernst van 11 of hoger zorgt ervoor dat de execute SQL_ERROR teruggeeft, en een daaropvolgende aanroep naar SQLGetDiagRec geeft SQLState 42000 terug. Bijvoorbeeld, de volgende stelling geeft SQL_SUCCESS_WITH_INFO terug:

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

Het aanroepen van SQLGetDiagRec geeft het volgende terug:

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

De volgende uitspraak geeft SQL_SUCCESS_WITH_INFO:

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

Het aanroepen van SQLGetDiagRec geeft het volgende terug:

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

De volgende uitspraak geeft SQL_ERROR:

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

Het aanroepen van SQLGetDiagRec geeft het volgende terug:

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

De timing van het aanroepen van SQLGetDiagRec is cruciaal wanneer output van PRINT- of RAISERROR-statements in een resultaatset wordt opgenomen. De aanroep naar SQLGetDiagRec om de PRINT- of RAISERROR-uitvoer op te halen, moet direct na de instructie die SQL_ERROR of SQL_SUCCESS_WITH_INFO ontvangt, worden uitgevoerd. Dit is eenvoudig wanneer slechts één SQL-instructie wordt uitgevoerd, zoals in de bovenstaande voorbeelden. In deze gevallen levert de aanroep naar SQLExecDirect of SQLExecute SQL_ERROR of SQL_SUCCESS_WITH_INFO terug en kan SQLGetDiagRec dan worden aangeroepen. Het is minder eenvoudig bij het coderen van lussen om de output van een batch SQL-statements te verwerken of bij het uitvoeren van SQL Server-opgeslagen procedures.

In dit geval geeft SQL Server een resultaatset terug voor elke SELECT-instructie die in een batch of opgeslagen procedure wordt uitgevoerd. Als de batch of procedure PRINT- of RAISERROR-instructies bevat, wordt de output daarvan afgewisseld met de SELECT-instructieresultaten. Als de eerste instructie in de batch of procedure een PRINT- of RAISERROR is, geeft de SQLExecute of SQLExecDirect SQL_SUCCESS_WITH_INFO of SQL_ERROR terug, en moet de applicatie SQLGetDiagRec aanroepen totdat SQL_NO_DATA terugkeert om de PRINT- of RAISERROR-informatie op te halen.

Als de PRINT- of RAISERROR-instructie volgt op een SQL-instructie (zoals een SELECT-instructie), wordt de PRINT- of RAISERROR-informatie teruggegeven wanneer SQLMoreResults zich positioneert op de resultaatset met de fout. SQLMoreResults geeft SQL_SUCCESS_WITH_INFO of SQL_ERROR terug, afhankelijk van de ernst van het bericht. Berichten worden opgehaald door SQLGetDiagRec aan te roepen totdat het SQL_NO_DATA teruggeeft.

Zie ook

Fouten en berichten verwerken