Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
Base de Dados SQL do Azure
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema 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.