Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-获取catch中的错误参数_Sql Server_Key_Unique_Message - Fatal编程技术网

Sql server SQL Server-获取catch中的错误参数

Sql server SQL Server-获取catch中的错误参数,sql-server,key,unique,message,Sql Server,Key,Unique,Message,可能重复: 我们的一个客户希望在出现唯一密钥冲突时提供自定义错误消息 鉴于以下情况: 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 INSE

可能重复:

我们的一个客户希望在出现唯一密钥冲突时提供自定义错误消息

鉴于以下情况:

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
创建表[dbo].[Pip]
(
id int标识(1,1)不为空,
代码NVARCHAR(50)不为空,
约束[PK_Pip]主键([id]),
约束[UQ\u Pip\u Code]唯一([Code]),
)
开始尝试
插入Pip(代码)值(“测试”)
插入Pip(代码)值(“测试”)
结束尝试
开始捕捉
声明@error INT、@message VARCHAR(4000)、@xstate INT;
选择@error=error\u NUMBER(),@message=error\u message(),@xstate=XACT\u STATE();
如果@errorNumber=2627或@errorNumber=2601开始
RAISERROR(“”,16,1)
结束
端接
我需要的是CATCH部分中被违反的唯一键的名称,以便我可以为每个定义的唯一键指定一条错误消息

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

SQL Server(2008R2)中是否存在这种可能性

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

谢谢

Sander

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

解析错误消息是唯一的方法。和Martin可能重复,谢谢。这确实是你先前提到的帖子的翻版。很抱歉,尝试搜索但未找到。我想我必须研究分析这些消息,然后:)我知道这一点,但我们打算做的是“提取”SQL server为唯一密钥冲突错误消息(2627)定义的参数;)他们在问如何做相反的事情。从SQL Server引发的错误中提取对象名称。“表%s中的键%s在键%s上出现了键冲突。您的意思是“,'PIP','PK_PIP'将是适当的,而不是相反的。”。表中只有两个键,不难,只是维护性高。如果你不想这样做(我不会),给客户一个合适的报价,可能会抑制他们愚蠢的欲望。