3

可能重复:
如何从 SQL Server 中找出 _exact_ 错误

我们的一位客户希望在违反 UNIQUE KEY 时获得自定义错误消息。

鉴于以下情况:

CREATE TABLE [dbo].[Pip]
(
    id int IDENTITY(1,1) NOT NULL,
    code NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_Pip] PRIMARY KEY ([id]), 
    CONSTRAINT [UQ_Pip_Code] UNIQUE([code]), 
)

BEGIN TRY
    INSERT INTO Pip(code) VALUES('TEST')
    INSERT INTO Pip(code) VALUES('TEST')
END TRY
BEGIN CATCH
    DECLARE @error INT, @message VARCHAR(4000), @xstate INT;
    SELECT @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();

    IF @errorNumber = 2627 OR @errorNumber = 2601 BEGIN
        RAISERROR('<custom unique key violation error message>', 16, 1)
    END
END CATCH

我需要的是 CATCH 部分中违反的唯一键的名称,以便我可以为每个定义的唯一键指定错误消息。

显然,我可以在访问该表的不同存储过程中手动添加检查 - 但是,这会导致代码的可维护性降低,这不是我们想要的。

SQL Server(2008R2)中是否有这种可能性?

我考虑过基于 sys.messages-table 用某种正则表达式解析 ERROR_MESSAGE() 。然而,这感觉像是做错了事。

谢谢!
桑德

4

1 回答 1

0

RaiseError 具有可选参数,因此您可以传入诸如表名之类的参数并将其替换。

直接来自帮助

RAISERROR (N'This is message %s %d.', -- Message text.
           10, -- Severity,
           1, -- State,
           N'number', -- First argument.
           5); -- Second argument.
-- The message text returned is: This is message number 5.
GO
于 2013-01-14T12:25:38.563 回答