Поиск объекта, который столкнулся с ошибкой в ​​блоке try/catch SQL Server

Я использую инструкции try... catch для обработки ошибок в SQL Server, и мне нужно распознать объект (например, код поля, который столкнулся с ошибкой), чтобы я мог показать свое собственное сообщение вместо системного сообщения об ошибке по умолчанию,

Вот моя хранимая процедура:

USE [ArbitraryDB]    
GO
SET ANSI_NULLS ON    
GO    
SET QUOTED_IDENTIFIER ON    
GO

ALTER PROCEDURE [dbo].[CTInsert_UserSkills]    
(    
@UserID_int int, @SkillSN_int int, @Ordering_tinyint tinyint,     
@SkillLevelSN_tinyint tinyint, @SkillYearcount_tinyint tinyint    
)    
AS    
BEGIN    
SET NOCOUNT ON;

DECLARE @ErrorMessage varchar(200), @ErrorCode int    
BEGIN TRY

INSERT INTO CT_UserSkills (UserID_int, SkillSN_int, Ordering_tinyint,     
SkillLevelSN_tinyint, SkillYearcount_tinyint)    
VALUES (@UserID_int, @SkillSN_int, @Ordering_tinyint, @SkillLevelSN_tinyint,     
@SkillYearcount_tinyint)    
END TRY

BEGIN CATCH    
SELECT ERROR_MESSAGE()    
END CATCH

END 

и вот вывод:

Cannot insert duplicate key row in object 'dbo.CT_UserSkills' with unique index 'IX_CT_UserSkills'. The duplicate key value is (4, 1). 

но на самом деле я ищу "%.*ls" в шаблоне сообщения об ошибке ниже с кодом 2601 в sysmessages:

Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'. 
The duplicate key value is %ls. 

Не могли бы вы мне помочь найти это ("%. * Ls")?

1 ответ

Добавьте другой параметр OUTPUT к хранимой процедуре:

ALTER PROCEDURE [dbo].[CTInsert_UserSkills]    
(    
@UserID_int int, @SkillSN_int int, @Ordering_tinyint tinyint,     
@SkillLevelSN_tinyint tinyint, @SkillYearcount_tinyint tinyint,    
@ObjectID int OUTPUT
) 

Затем в вашем блоке catch задайте для этой переменной любое значение, которое необходимо отправить обратно вызывающей программе.

Другие вопросы по тегам