通过 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;
我尝试在 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;