【问题标题】:TSQL error checking code not workingTSQL 错误检查代码不起作用
【发布时间】:2013-01-22 23:09:15
【问题描述】:

当在视图中执行查询时出错时,我正在尝试向我的日志中添加一条警报,以便将视图运行插入表中。当我单独运行视图时,我在 SUBSTRING 中得到一个无效的输入(我不记得错误的确切措辞)。当我将它作为视图的一部分运行时-> 表存储过程,该错误被忽略,然后我必须去挖掘有问题的行并在视图的代码中创建一个异常以从结果中省略该行(我知道,它听起来很杂乱,但我正在从一个专门的 web 应用程序中对巨大的 web 日志文件进行数据缩减),但我离题了。

我尝试了两种不同的方法来尝试捕获错误,但都没有以在我的执行结果表 (refresh_results) 中插入指示错误的行的方式触发。我想我可能遗漏了一些基本的东西——也许这些错误正在以某种方式被封装。如果我无法检测到错误,那么注意到错误的唯一方法是如果有人注意到表中的条目数在给定的时间段内很低。

    SELECT @TransactionName = 'tname';
    BEGIN TRANSACTION @TransactionName;
    BEGIN TRY
      print 'tname ***In Try***';
      if exists (select name from sysobjects where name='tablename')
      begin
        drop table tablename;
      end
      select * into tablename 
      from opendatasource('SQLNCLI', 'Data Source=DATABASE;UID=####;password=####').dbo.viewname;
      COMMIT TRANSACTION @TransactionName;
    END TRY
    BEGIN CATCH 
      print 'tablename ***ERROR - check for SUBSTRING***';
      begin transaction
      set   @result_table = 'tablename ***ERROR - check for SUBSTRING***'
      select    @result_time = getdate(),
            @result_rows = count(logtime)
      from tablename
      insert INTO   [dbo].[refresh_results] (result_time, result_table, result_rows)
                values (@result_time, @result_table, @result_rows);
      commit transaction
      ROLLBACK TRANSACTION @TransactionName;
    END CATCH 

    if exists (select name from sysobjects where name='tablename')
    begin
      drop table tablename;
    end
    select * into tablename 
    from opendatasource('SQLNCLI', 'Data Source=DATABASE;UID=####;password=####').dbo.viewname;

    print '@@error' 
print @@error

if @@error <> 0 
Begin
      print 'tablename ***ERROR - check for SUBSTRING***';
      set     @result_table = 'tablename ***ERROR - check for SUBSTRING***'
      select  @result_time = getdate(),
          @result_rows = count(logtime)
      from tablename
      insert INTO   [dbo].[refresh_results] (result_time, result_table, result_rows)
                values (@result_time, @result_table, @result_rows);
    End

【问题讨论】:

  • 仅供参考:在发布示例时,习惯上会编辑用户名和密码。
  • 哎呀,我编辑了所有内容,但... :)

标签: sql sql-server tsql error-handling transactions


【解决方案1】:

您的嵌套事务并没有按照您的想法进行。您正在回滚您认为存储的错误。回滚初始事务,然后,如果您觉得需要,启动一个新事务来记录错误。

here

【讨论】:

    【解决方案2】:

    你有两个不同的问题

    在您的第一个示例中,您正在运行执行以下操作的事务:

    BEGIN TRAN
        ...error...
        BEGIN TRAN
            ...log error...
        COMMIT TRAN
    ROLLBACK TRAN
    

    内部事务与外部事务一起回滚。也许试试:

    BEGIN TRAN
        ...error...
    ROLLBACK TRAN
    BEGIN TRAN
        ...log error...
    ROLLBACK TRAN
    

    您使用的第二个示例@@ERROR。据我了解,只要您运行某些东西,@@ERROR 就会被替换。我认为这包括 print 语句。

    如果您将其更改为:

    DECLARE @Error INT
    select * into tablename 
    from opendatasource('SQLNCLI', 'Data Source=DATA3;UID=;password=').dbo.viewname;
    
    SET @Error = @@ERROR
    print '@@error' 
    print @Error
    
    if @Error <> 0
    ...log the error
    

    TRY CATCH 的优点是,如果您有错误,它会捕获它。 @@ERROR 方法 100% 有效,但仅适用于最后一行运行。所以如果你对DROP TABLE tablename 有错误@@ERROR 不会得到它(除非你添加另一个检查)

    【讨论】:

    • 我尝试了您的最后一个建议,在检查之前将@error 设置为@@error,并且无法捕获错误并导致错误代码。
    • 当你尝试它会发生什么?
    • 它在结果选项卡中返回值 0,在消息选项卡中返回 1 行。我什至把场景弄得太乱了,打印,打印,同样的事情发生了。
    • 我不确定在结果集中选择了什么 0 或为什么您没有收到您的打印语句。如果您取出SET @Error = @@ERROR 语句,那么您将不会在@Error 中获得IF 语句的值
    【解决方案3】:

    好的,所以我不得不使用辅助程序来添加日志条目。我认为发生的事情是回滚也在回滚日志条目。

    这是我必须做的:

        DECLARE @myError tinyint;
        BEGIN TRY
            BEGIN TRANSACTION;      
            if exists (select name from sys.sysobjects where name='table_name')
            begin
              drop table table_name
            end
            select * into table_name
              from opendatasource('SQLNCLI', 'Data Source=###;UID=###;password=###').view_Table
            COMMIT TRANSACTION;
        END TRY
        BEGIN CATCH 
            set @myError = 1                
            ROLLBACK TRANSACTION;
        END CATCH
    
        if @myError <> 0
        begin
            exec dbo.table error
        end
        ELSE
            EXEC  exec dbo.table normal row
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2011-09-24
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多