Published on

December 29, 2008

Обработка ошибок в SQL Server

Как разработчик, вы можете столкнуться с ситуациями, когда вам необходимо обрабатывать ошибки в вашей базе данных SQL Server. В этой статье мы рассмотрим, как регистрировать и извлекать описания ошибок в SQL Server 2000, даже если у него нет встроенной функциональности для этого.

Допустим, у вас есть служба Windows, которая действует как планировщик для обработки заказов на основе их статуса. Вы хотите вызвать хранимую процедуру в запланированное время и сообщить обо всех возникающих ошибках. В SQL Server 2000 нет возможности извлечь описание ошибки напрямую. Однако мы можем обойти это ограничение, используя две функции:

  1. Регистрация ошибок в журнале ошибок SQL Server с помощью системной хранимой процедуры sp_altermessage.
  2. Чтение журнала ошибок SQL Server с помощью системной хранимой процедуры xp_readerrorlog.

Чтобы продемонстрировать это, давайте создадим хранимую процедуру с именем sp_GetErrorDesc, которая предоставляет описание ошибки на основе номера ошибки:

CREATE PROCEDURE sp_GetErrorDesc
    @ErrorNumber INT,
    @ErrorDesc VARCHAR(200) OUTPUT
AS
BEGIN
    SELECT TOP 1 @ErrorDesc = [Text]
    FROM sys.messages
    WHERE message_id = @ErrorNumber
    ORDER BY [date] DESC

    RETURN
END

Теперь предположим, у нас есть оператор обновления, который генерирует ошибку:

UPDATE Customers
SET CustomerID = NULL
WHERE CompanyName = 'Antonio Moreno Taquería'

При выполнении этого запроса мы получаем следующее сообщение об ошибке:

Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'CustomerID', table 'Northwind.dbo.Customers'; column does not allow nulls.
UPDATE fails.

Чтобы зарегистрировать эту ошибку в журнале ошибок SQL Server, мы можем использовать хранимую процедуру sp_altermessage:

EXEC sp_altermessage 515, 'WITH_LOG', 'TRUE'

Теперь давайте вызовем хранимую процедуру sp_GetErrorDesc, чтобы извлечь описание ошибки:

DECLARE @Error INT, @ErrorDesc VARCHAR(200)

UPDATE Customers
SET CustomerID = NULL
WHERE CompanyName = 'Antonio Moreno Taquería'

SET @Error = @@ERROR

EXEC sp_GetErrorDesc @Error, @ErrorDesc OUTPUT

PRINT @ErrorDesc

Результатом этого запроса будет:

Cannot insert the value NULL into column 'CustomerID', table 'Northwind.dbo.Customers'; column does not allow nulls.

Используя хранимые процедуры sp_altermessage и sp_GetErrorDesc, мы можем регистрировать и извлекать описания ошибок в SQL Server 2000. Это позволяет нам более эффективно обрабатывать ошибки и предоставлять понятные сообщения об ошибках пользователям.

Важно отметить, что хранимая процедура sp_altermessage не только регистрирует ошибку в журнале ошибок SQL Server, но также в журнале событий Windows.

Не стесняйтесь использовать предоставленный в разделе “Ресурсы” этой статьи скрипт sp_GetErrorDesc в своих собственных приложениях.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.