为什么我在 try 中看不到实际的错误消息...抓住?[复制]

Why can I not see the actual errormessage in try...catch? [duplicate]

提问人:Henrov 提问时间:11/16/2023 最后编辑:marc_sHenrov 更新时间:11/17/2023 访问量:51

问:

在我试图将 插入到表中,但它总是给我错误的错误消息。它告诉我查看上一条消息。为什么?TRY...CATCHERROR_MESSAGE()

请参见以下代码:

IF OBJECT_ID('coolguy.joyhnybravo') IS NOT NULL
   DROP TABLE [coolguy].[joyhnybravo]
 
CREATE TABLE [coolguy].[joyhnybravo]
(
    [hair] [int] NOT NULL,
    [sunglasses] [int] NOT NULL,
)
 
INSERT INTO [coolguy].[joyhnybravo]
select 1,1
union all 
select 1,1
 
SELECT * FROM [coolguy].[joyhnybravo]

BEGIN TRY  
    ALTER TABLE coolguy.joyhnybravo  
        ADD PRIMARY KEY (hair, sunglasses) 
END TRY 
BEGIN CATCH 
    SELECT
        GETDATE(), 'ERROR', 'PK (hair, sunglasses) could not be set for coolguy.joyhnybravo 
| STATEMENT: ALTER TABLE coolguy.joyhnybravo ADD PRIMARY KEY (hair, sunglasses)''
| ERROR_NUMBER(): '+CAST(ISNULL(ERROR_NUMBER(),'') AS VARCHAR(10)) +'
| ERROR_SEVERITY(): '+CAST(ISNULL(ERROR_SEVERITY(),'') AS VARCHAR(10)) +'
| ERROR_STATE(): '+CAST(ISNULL(ERROR_STATE(),'') AS VARCHAR(10)) +'
| ERROR_PROCEDURE(): '+CAST(ISNULL(ERROR_PROCEDURE(),'') AS SYSNAME) +'
| ERROR_LINE(): '+CAST(ISNULL(ERROR_LINE(),'') AS VARCHAR(1000)) +'
| ERROR_MESSAGE(): '+CAST(ISNULL(ERROR_MESSAGE(),'') AS VARCHAR(1000)) 
END CATCH

这是我得到的:

() ERROR_MESSAGE(): 无法创建约束或索引。请参阅以前的错误。

但这就是我在尝试之外执行语句时得到的......抓住

ALTER TABLE coolguy.joyhnybravo 
    ADD PRIMARY KEY (hair, sunglasses)

消息 1505,级别 16,状态 1,第 17
行 CREATE UNIQUE INDEX 语句终止,因为发现对象名称“coolguy.joyhnybravo”和索引名称“PK__joyhnybr__CAF8A5F7EECF20F3”的键重复。重复的键值为 (1, 1)。

消息 1750,级别 16,状态 1,第 17 行
无法创建约束或索引。请参阅以前的错误。
该声明已被终止。

我最想抓住的是这句话:

CREATE UNIQUE INDEX 语句终止,因为发现对象名称“coolguy.joyhnybravo”和索引名称“PK__joyhnybr__CAF8A5F7EECF20F3”的键重复。重复的键值为 (1, 1)。

怎么做呢?

sql-server try-catch sql-server-2019

评论

3赞 Charlieface 11/16/2023
在普通 TSQL 中无法收到多条错误消息。你也许可以破解它,但最好将错误处理转移到 C# 或 Powershell 等客户端应用程序,或者更好的是:首先找出它出错的原因。例如,在创建密钥之前,请查看是否有任何重复项。DBCC OUTPUTBUFFER

答:

-3赞 Priya Maheshwari 11/17/2023 #1
Try the below --->
BEGIN CATCH
    DECLARE  @ERROR_MESSAGE NVARCHAR(2048) = ERROR_MESSAGE()
    RAISERROR (@ERROR_MESSAGE,16,16)
END CATCH       

OR below way --->
BEGIN CATCH
    THROW;
END CATCH       


and then use the select query outside the catch block

 SELECT
        GETDATE(), 'ERROR', 'PK (hair, sunglasses) could not be set for coolguy.joyhnybravo 
| STATEMENT: ALTER TABLE coolguy.joyhnybravo ADD PRIMARY KEY (hair, sunglasses)''
| ERROR_NUMBER(): '+CAST(ISNULL(ERROR_NUMBER(),'') AS VARCHAR(10)) +'
| ERROR_SEVERITY(): '+CAST(ISNULL(ERROR_SEVERITY(),'') AS VARCHAR(10)) +'
| ERROR_STATE(): '+CAST(ISNULL(ERROR_STATE(),'') AS VARCHAR(10)) +'
| ERROR_PROCEDURE(): '+CAST(ISNULL(ERROR_PROCEDURE(),'') AS SYSNAME) +'
| ERROR_LINE(): '+CAST(ISNULL(ERROR_LINE(),'') AS VARCHAR(1000)) +'
| ERROR_MESSAGE(): '+CAST(ISNULL(ERROR_MESSAGE(),'') AS VARCHAR(1000)) 

Hope this helps!