Processamento de declarações que geram mensagens

Aplica-se a: SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)

As Transact-SQL SET opções STATISTICS TIME de instruções são STATISTICS IO usadas para obter informações que ajudam a diagnosticar consultas de longa duração. Versões anteriores do SQL Server também suportam a opção SHOWPLAN para analisar planos de consulta. Uma aplicação ODBC pode definir estas opções executando as seguintes instruções:

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

Quando SETSET STATISTICS TIME ou SET o SHOWPLAN estiverem ligados, o SQLExecute e o SQLExecDirect retornam SQL_SUCCESS_WITH_INFO e, nesse ponto, a aplicação pode recuperar o SHOWPLAN ou STATISTICS TIME a saída chamando SQLGetDiagRec até que este retorne SQL_NO_DATA. Cada linha de dados do SHOWPLAN aparece no formato seguinte:

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

O SQL Server versão 7.0 substituiu a opção SHOWPLAN por SHOWPLAN_ALL e SHOWPLAN_TEXT, ambos retornando a saída como um conjunto de resultados, e não como um conjunto de mensagens.

Cada linha de STATISTICS TIME volta no formato:

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

A saída de SETSET STATISTICS IO só está disponível no final de um conjunto de resultados. Para obter STATISTICS IO saída, a aplicação chama SQLGetDiagRec no momento em que SQLFetch ou SQLFetchScroll devolve SQL_NO_DATA. A saída de STATISTICS IO volta no formato:

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

Utilização de Instruções DBCC

As instruções DBCC devolvem os seus dados como mensagens, não como conjuntos de resultados. SQLExecDirect ou SQLExecute retornam SQL_SUCCESS_WITH_INFO, e a aplicação recupera a saída chamando SQLGetDiagRec até que este retorne SQL_NO_DATA.

Por exemplo, a seguinte instrução retorna SQL_SUCCESS_WITH_INFO:

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

Chamadas para SQLGetDiagRec retornam:

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

Utilização de instruções PRINT e RAISERROR

Transact-SQL instruções PRINT e RAISERROR também retornam dados chamando SQLGetDiagRec. As instruções PRINT fazem com que a execução da instrução SQL retorne SQL_SUCCESS_WITH_INFO, e uma chamada subsequente ao SQLGetDiagRec devolve um SQLState de 01000. Um RAISERROR com gravidade de dez ou menos comporta-se da mesma forma que o PRINT. Um RAISERROR com gravidade de 11 ou superior faz com que a execução devolva SQL_ERROR, e uma chamada subsequente ao SQLGetDiagRec devolve SQLState 42000. Por exemplo, a seguinte instrução retorna SQL_SUCCESS_WITH_INFO:

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

Chamar SQLGetDiagRec retorna:

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

A seguinte instrução retorna SQL_SUCCESS_WITH_INFO:

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

Chamar SQLGetDiagRec retorna:

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

A seguinte instrução retorna SQL_ERROR:

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

Chamar SQLGetDiagRec retorna:

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

O momento de chamar SQLGetDiagRec é crítico quando a saída de instruções PRINT ou RAISERROR é incluída num conjunto de resultados. A chamada ao SQLGetDiagRec para recuperar a saída PRINT ou RAISERROR deve ser feita imediatamente após a instrução que recebe SQL_ERROR ou SQL_SUCCESS_WITH_INFO. Isto é simples quando apenas uma única instrução SQL é executada, como nos exemplos acima. Nestes casos, a chamada para SQLExecDirect ou SQLExecute retorna SQL_ERROR ou SQL_SUCCESS_WITH_INFO e SQLGetDiagRec pode então ser chamado. É menos direto ao programar ciclos para gerir a saída de um lote de instruções SQL ou ao executar procedimentos armazenados do SQL Server.

Neste caso, o SQL Server devolve um conjunto de resultados para cada instrução SELECT executada num batch ou procedimento armazenado. Se o lote ou procedimento contiver instruções PRINT ou RAISERROR, a saída destas é intercalada com os conjuntos de resultados da instrução SELECT. Se a primeira instrução do lote ou procedimento for um PRINT ou RAISERROR, o SQLExecute ou SQLExecDirect devolve SQL_SUCCESS_WITH_INFO ou SQL_ERROR, e a aplicação precisa de chamar SQLGetDiagRec até que este retorne SQL_NO_DATA para recuperar a informação PRINT ou RAISERROR.

Se a instrução PRINT ou RAISERROR vier após uma instrução SQL (como uma instrução SELECT), então a informação PRINT ou RAISERROR é devolvida quando SQLMoreResults se posiciona no conjunto de resultados que contém o erro. SQLMoreResults devolve SQL_SUCCESS_WITH_INFO ou SQL_ERROR dependendo da gravidade da mensagem. As mensagens são recuperadas chamando SQLGetDiagRec até que este retorne SQL_NO_DATA.

Ver também

Tratamento de erros e mensagens