Как разработчик, вы можете столкнуться с ситуациями, когда вам необходимо обрабатывать ошибки в вашей базе данных SQL Server. В этой статье мы рассмотрим, как регистрировать и извлекать описания ошибок в SQL Server 2000, даже если у него нет встроенной функциональности для этого.
Допустим, у вас есть служба Windows, которая действует как планировщик для обработки заказов на основе их статуса. Вы хотите вызвать хранимую процедуру в запланированное время и сообщить обо всех возникающих ошибках. В SQL Server 2000 нет возможности извлечь описание ошибки напрямую. Однако мы можем обойти это ограничение, используя две функции:
- Регистрация ошибок в журнале ошибок SQL Server с помощью системной хранимой процедуры
sp_altermessage. - Чтение журнала ошибок 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 в своих собственных приложениях.