Поделиться через


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

Параметры STATISTICS TIME и STATISTICS IO инструкции SET языка Transact-SQL используются для получения сведений, помогающих при диагностике долго выполняющихся запросов. Предыдущие версии 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 = 2528
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]
   DBCC execution completed. If DBCC printed error messages,
   see your System Administrator."

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

Инструкции языка Transact-SQL PRINT и RAISERROR также возвращают данные при вызове функции 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 или выполнении хранимых процедур SQL Server возникают осложнения.

В этом случае 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.

См. также

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

Обработка ошибок и сообщений