2013-01-22 35 views
1

我想提醒添加到我的日志中的视图的运行插入表时,有执行视图查询错误。当我单独运行视图时,会在SUBSTRING中输入无效的输入(错误的确切写法,我记不起来了)。当我运行它作为我的部分观点 - >表的存储过程,错误被忽略,那么我必须去挖掘问题的行,并在视图的代码的异常省略从结果该行(我知道,这听起来很糟糕,但是我正在从一个专门的Web应用程序中减少巨大的Web日志文件),但我离题了。TSQL错误校验码不工作

我已经试过了试图赶上错误两种不同的方法,并没有以这样的方式被触发插入指示错误的行中我的执行结果表(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 
+2

供参考:这是习惯张贴样品时纂用户名和密码。 – HABO

+0

亚克西,我节录一切,但那个... :) – MattInSD73

回答

0

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

这是我必须做的:

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 
3

你嵌套事务是不是做你的想法。您正在回滚您认为存储的错误。回滚最初的事务,然后,如果您觉得需要,请启动一个新的事务来记录错误。

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被替换。我认为这包括打印声明。

如果将其更改为类似:

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不会得到它(除非你添加其他检查)

+0

我想你的最后一个建议,设置@error检查之前@@错误,这是一个没有去捕获错误并领先进入错误代码。 – MattInSD73

+0

当你尝试时会发生什么? – Greg

+0

它返回结果选项卡中的值0和在受影响的消息选项卡1行(多个)。我甚至出场,出版,印刷和发生同样的事情。 – MattInSD73