3

如果从数据库中删除任何表,我想处理错误情况就像 -

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' 不在数据库中,那么我将如何收到错误消息

4

3 回答 3

3

单程

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
于 2012-05-22T13:28:25.943 回答
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 语句结束会话时。

以下类型的错误发生在与 TRY...CATCH 构造相同的执行级别时,不会由 CATCH 块处理:

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

你可以试试这个...

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

ELSE
BEGIN
//RAISE ERROR HERE
END
GO
于 2012-05-22T13:37:27.087 回答