【问题标题】:SQL Server - obtain error parameters in catch [duplicate]SQL Server - 在catch中获取错误参数[重复]
【发布时间】:2013-01-14 12:20:18
【问题描述】:

可能重复:
How do I find out the _exact_ error from SQL Server

我们的一位客户希望在违反 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 表使用某种正则表达式解析 ERROR_MESSAGE()。然而,这感觉是错误的做法。

谢谢!
砂光机

【问题讨论】:

标签: sql-server key unique message


【解决方案1】:

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

【讨论】:

  • 我知道这一点,但我们打算做的是“提取”由 SQL 服务器为唯一密钥冲突错误消息 (2627) 定义的参数。 ;)
  • 他们在问如何做相反的事情。从 SQL Server 引发的错误中提取对象名称。
  • 'There was key violation in table %s on Key %s you mean','PIP','PK_PIP' 是恰当的,而不是相反的。表中只有两个键,不难,只是高维护。如果你不想做(我不会),给客户一个合适的报价,可能会抑制他们的愚蠢欲望。
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多