如果从数据库中删除任何表,我想处理错误情况就像 -
ALTER procedure ABC as
begin tran tansinsert
insert into table1 values (1,2,3)
if @@error <> 0
begin
rollback tran tansinsert
end
else
begin
commit tran tansinsert
end
如果我正在运行这个 proc 并且表 'table1' 不在数据库中,那么我将如何收到错误消息
如果从数据库中删除任何表,我想处理错误情况就像 -
ALTER procedure ABC as
begin tran tansinsert
insert into table1 values (1,2,3)
if @@error <> 0
begin
rollback tran tansinsert
end
else
begin
commit tran tansinsert
end
如果我正在运行这个 proc 并且表 'table1' 不在数据库中,那么我将如何收到错误消息
单程
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[table1 ]') AND type in (N'U'))
BEGIN
RAISERROR(......)
END
ELSE
BEGIN
--rest of flow
END
GO
捕获错误的示例代码
BEGIN TRY
EXECUTE Abc
END TRY
BEGIN CATCH
print 'Error got'
SELECT
ERROR_NUMBER() as ErrorNumber,
ERROR_MESSAGE() as ErrorMessage;
END CATCH;
如果您执行以下操作,这将不起作用。
CREATE PROC test
AS
BEGIN TRY
SELECT * FROM NonexistentTable
END TRY
BEGIN CATCH
-- some code
END CATCH
唯一可行的方法是,如果您有一个存储过程调用另一个存储过程,例如:
CREATE PROC Test
AS
SELECT * FROM NonexistentTable
GO
CREATE PROC test2
AS
BEGIN TRY
EXECUTE Test
END TRY
BEGIN CATCH
-- some code
END CATCH
GO
TRY...CATCH 构造不会捕获以下条件:
严重性为 10 或更低的警告或信息性消息。
严重性为 20 或更高的错误会停止会话的 SQL Server 数据库引擎任务处理。如果发生严重程度为 20 或更高的错误并且数据库连接未中断,则 TRY...CATCH 将处理该错误。
注意,例如客户端中断请求或断开的客户端连接。
当系统管理员使用 KILL 语句结束会话时。
以下类型的错误发生在与 TRY...CATCH 构造相同的执行级别时,不会由 CATCH 块处理:
你可以试试这个...
IF OBJECT_ID('DBNAME..TABLENAME') IS NOT NULL
BEGIN
//YOUR CODE FLOW HERE
END
ELSE
BEGIN
//RAISE ERROR HERE
END
GO