如果数据库中不存在表,则引发错误

时间:2012-05-22 13:25:49

标签: 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

如果我正在运行此proc并且表'table1'不在数据库中而不是我将收到错误消息

3 个答案:

答案 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构造不会捕获以下条件:

  1. 严重性为10或更低的警告或信息性消息。

  2. 严重性为20或更高的错误,用于停止会话的SQL Server数据库引擎任务处理。如果发生严重性为20或更高且数据库连接未中断的错误,则TRY ... CATCH将处理错误。

  3. 注意事项,例如客户端中断请求或客户端连接断开。

  4. 系统管理员使用KILL语句结束会话时。

  5. 当CATCH块与TRY ... CATCH构造处于相同的执行级别时,它们不会处理以下类型的错误:

    1. 编译阻止批处理运行的错误,例如语法错误。
    2. 语句级重新编译期间发生的错误,例如由于延迟名称解析而在编译后发生的对象名称解析错误。

答案 2 :(得分:1)

你可以试试这个......

IF OBJECT_ID('DBNAME..TABLENAME') IS NOT NULL
BEGIN
//YOUR CODE FLOW HERE
END

ELSE
BEGIN
//RAISE ERROR HERE
END
GO