如果从数据库中删除任何表,我想处理错误 情况就像 -
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'不在数据库中而不是我将收到错误消息
答案 0 :(得分:2)
单程
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
答案 1 :(得分:1)
捕获错误的示例代码
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语句结束会话时。
当CATCH块与TRY ... CATCH构造处于相同的执行级别时,它们不会处理以下类型的错误:
答案 2 :(得分:1)
你可以试试这个......
IF OBJECT_ID('DBNAME..TABLENAME') IS NOT NULL
BEGIN
//YOUR CODE FLOW HERE
END
ELSE
BEGIN
//RAISE ERROR HERE
END
GO