Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 若数据库中不存在表,则引发错误_Sql Server 2008 - Fatal编程技术网

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

  • 严重性为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
    

    感谢您的回复,是的,我可以先检查表是否存在,但在我的情况下,proc中使用了30多个表。若表不在那个里,有什么方法可以捕捉到异常,在编译过程中它可以编译,但不会回滚@错误时的事务吗