这是一个非常简单的代码,但它无法捕获错误。
或者如何捕获错误?
感谢。
BEGIN TRY
ALTER TABLE [dbo].[my_table_name]
ADD PRIMARY KEY ([id]);
END TRY
BEGIN CATCH
PRINT 'Primary Key already exists. '
END CATCH
答案 0 :(得分:5)
在延迟名称解析后因批量重新编译而发生的错误无法在错误发生的同一级别捕获。一种解决方法是将DDL包装在动态SQL中:
BEGIN TRY
EXEC(N'ALTER TABLE [dbo].[my_table_name] ADD PRIMARY KEY ([id]);');
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 1779
BEGIN
--handle expected errors
PRINT 'Primary Key already exists. ';
END
ELSE
BEGIN
--raise other unexpected errors
THROW;
END;
END CATCH;
答案 1 :(得分:0)
第一个答案绝对好,但是当您使用 DDL 时还有另一种方法可以捕获错误,使用 TRY
块内的存储过程。
基于 MS documentation。
如果您不想保留存储过程,可以在尝试结束时轻松删除它。
DROP PROCEDURE IF EXISTS dbo.sp_my_proc
GO
CREATE PROCEDURE dbo.sp_my_proc
AS
--Your original code here:
ALTER TABLE [dbo].[my_table_name]
ADD PRIMARY KEY ([id]);
GO
BEGIN TRY
EXECUTE dbo.sp_my_proc
--Optional, if you don't want to keep sp
DROP PROCEDURE IF EXISTS dbo.sp_my_proc
END TRY
BEGIN CATCH
--Catch your error here
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
所以有两种方法可以解决这个问题。