Обработка инструкций, которые выдают сообщения

Параметры инструкции SET Transact-SQL STATISTICS TIME и STATISTICS IO используются для получения сведений, помогающих при диагностике долго выполняющихся запросов. Предыдущие версии SQL Server также поддерживают параметр SHOWPLAN для анализа планов запросов. Приложение ODBC может установить эти параметры путем выполнения следующих инструкций:

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

Если SET STATISTICS TIME или SET SHOWPLAN установлены в значение ON, то SQLExecute и SQLExecDirect возвращают SQL_SUCCESS_WITH_INFO, и в этот момент приложение может получить выходные данные SHOWPLAN или STATISTICS TIME, вызывая SQLGetDiagRec пока не будет возвращено SQL_NO_DATA. Каждая строка данных SHOWPLAN возвращается в следующем формате.

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

В SQL Server версии 7.0 параметр SHOWPLAN заменен на SHOWPLAN_ALL и SHOWPLAN_TEXT, которые возвращают выходные данные в виде результирующего набора, а не набора сообщений.

Каждая строка STATISTICS TIME возвращается в следующем формате.

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

Выходные данные SET STATISTICS IO недоступны до завершения результирующего набора. Чтобы получить выходные данные STATISTICS IO, приложение вызывает SQLGetDiagRec в то время, когда SQLFetch или SQLFetchScroll возвращает SQL_NO_DATA. Выходные данные STATISTICS IO возвращаются в следующем формате.

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

Использование инструкций DBCC

Инструкции DBCC возвращают свои данные в виде сообщений, а не результирующих наборов. Функции SQLExecDirect и SQLExecute возвращают SQL_SUCCESS_WITH_INFO, и приложение получает выходные данные путем вызова SQLGetDiagRec пока не будет возвращено SQL_NO_DATA.

Например, следующая инструкция возвращает SQL_SUCCESS_WITH_INFO.

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

Вызов метода SQLGetDiagRec возвращает:

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 = 2528szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]   DBCC execution completed. If DBCC printed error messages,   see your System Administrator."

Использование инструкций PRINT и RAISERROR

Инструкции PRINT and RAISERROR Transact-SQL также возвращают данные путем вызова функции SQLGetDiagRec. Инструкции PRINT вызывают выполнение инструкции SQL для возвращения SQL_SUCCESS_WITH_INFO, а последующий вызов функции SQLGetDiagRec возвращает SQLState с кодом 01000. RAISERROR с уровнем серьезности, равным 10 и менее, демонстрирует такое же поведение, что и PRINT. RAISERROR с уровнем серьезности, равным 11 и более вызывает выполнение для возвращения SQL_ERROR, а последующий вызов функции SQLGetDiagRec возвращает SQLState с кодом 42000. Например, следующая инструкция возвращает SQL_SUCCESS_WITH_INFO.

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

Вызов метода SQLGetDiagRec возвращает:

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

Следующая инструкция возвращает SQL_SUCCESS_WITH_INFO.

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

Вызов метода SQLGetDiagRec возвращает:

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

Следующая инструкция возвращает SQL_ERROR.

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

Вызов метода SQLGetDiagRec возвращает:

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

Время вызова функции SQLGetDiagRec критично, когда выходные данные от PRINT или RAISERROR включаются в результирующий набор. Вызов функции SQLGetDiagRec для получения выходных данных PRINT или RAISERROR должен быть сделан сразу после инструкции, которая получает SQL_ERROR или SQL_SUCCESS_WITH_INFO. Это просто только в случае выполнения инструкции SQL, как показано в примере выше. В этих случаях функция SQLExecDirect или SQLExecute возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, и затем можно вызвать функцию SQLGetDiagRec. При программировании циклов или выполнении хранимых процедур SQL Server проще обрабатывать выходные данные пакета инструкций SQL.

В этом случае SQL Server возвращает результирующий набор для каждой инструкции SELECT, выполненной в пакете или хранимой процедуре. Если пакет или процедура содержит инструкции PRINT или RAISERROR, то выходные данные для них чередуются с результирующими наборами инструкций. Если первой инструкцией пакета или процедуры является PRINT или RAISERROR, то функции SQLExecute и SQLExecDirect возвращают SQL_SUCCESS_WITH_INFO или SQL_ERROR, и приложению необходимо вызывать функцию SQLGetDiagRec пока не будет возвращено SQL_NO_DATA для получения сведений о PRINT или RAISERROR.

Если инструкции PRINT и RAISERROR выполняются после инструкции SQL (например, SELECT), то сведения PRINT или RAISERROR возвращаются, когда SQLMoreResults устанавливается на результирующем наборе, содержащем ошибку. Функция SQLMoreResults возвращает SQL_SUCCESS_WITH_INFO или SQL_ERROR, в зависимости от уровня серьезности сообщения. Сообщения получаются вызовом функции SQLGetDiagRec пока не будет возвращено SQL_NO_DATA.

См. также

Основные понятия