Sql server 2008 若数据库中不存在表,则引发错误
如果从数据库中删除任何表,我希望处理错误 情况是这样的-Sql server 2008 若数据库中不存在表,则引发错误,sql-server-2008,Sql Server 2008,如果从数据库中删除任何表,我希望处理错误 情况是这样的- 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 将过程ABC更改为 开始训练 在表1中插入数值(1,2,3) 如果@错误0 开始 回滚传输
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
将过程ABC更改为
开始训练
在表1中插入数值(1,2,3)
如果@错误0
开始
回滚传输
结束
其他的
开始
提交Trans-tansinsert
结束
如果我正在运行此过程,并且表“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构造不会捕获以下条件:
IF OBJECT_ID('DBNAME..TABLENAME') IS NOT NULL
BEGIN
//YOUR CODE FLOW HERE
END
ELSE
BEGIN
//RAISE ERROR HERE
END
GO
感谢您的回复,是的,我可以先检查表是否存在,但在我的情况下,proc中使用了30多个表。若表不在那个里,有什么方法可以捕捉到异常,在编译过程中它可以编译,但不会回滚@错误时的事务吗