通过 SQL 中的 BEGIN CATCH 使用自定义消息捕获异常

Catch exceptions with custom messages via BEGIN CATCH in TSQL

我尝试在 SQL 服务器管理工​​作室中实现 T-SQL try catch。这是我的代码:

BEGIN
BEGIN TRY
 alter table [SalesLT].[ProductModel]
 add testtimestamp123 timestamp 
END TRY
BEGIN CATCH
    RAISERROR('MY CUSTOMIZED ERROR MESSAGE',16,1)
END CATCH
END;

我的期望是,如果我在 sql server management studio 中 运行 此代码,我会收到我的自定义消息(因为我在此 table 中有一个包含时间戳数据类型的列)但我收到这条消息: A table can only have one timestamp column. Because table 'ProductModel' already has one, the column 'testtimestamp123' cannot be added.

我应该怎么做才能用自定义消息捕获异常?

将 sql 语句转换为动态 SQL 然后错误将在执行时抛出,而不是在解析时抛出。例如。像这样

DECLARE @sql nvarchar(max) = 'alter table demo add testtimestamp123 timestamp ';
BEGIN TRY
    EXEC sp_executesql @sql 
END TRY
BEGIN CATCH
    RAISERROR('MY CUSTOMIZED ERROR MESSAGE',16,1)
END CATCH

并非T-SQL中的所有异常都可以被“捕获”。这是其中之一。

如果您不想使用“动态”语句,您可以针对 sys 对象使用 EXISTS,然后您可以 THROW 您的自定义错误,如果列已经存在:

CREATE TABLE dbo.SomeTable (Id int,
                            rowversion rowversion); --Don't use timestamp, it's deprecated

GO
IF NOT EXISTS (SELECT 1
               FROM sys.schemas s
                    JOIN sys.tables t ON s.schema_id = t.schema_id
                    JOIN sys.columns c ON t.object_id = c.object_id
               WHERE s.name = N'dbo'
                 AND t.name = N'SomeTable'
                 AND c.name = N'rowversion')
    ALTER TABLE dbo.SomeTable ADD rowversion rowversion;
ELSE
    THROW 65762, N'A column of the name you want to create already exists. I can''t do this. Sorry :(', 10;

GO
DROP TABLE dbo.SomeTable;