ビューでクエリを実行中にエラーが発生した場合に、テーブルへのビューの実行中の挿入に関するアラートをログに追加しようとしています。ビューを単独で実行すると、SUBSTRING に無効な入力が返されます (エラーの正確な文言は覚えていません)。ビュー -> テーブル ストアド プロシージャの一部として実行すると、エラーは無視されます。問題のある行を探して、ビューのコードで例外を作成し、結果からその行を除外する必要があります (わかっています。くだらないように聞こえますが、私は専用の webapp からの巨大な web-log ファイルのデータ削減を行っています) が、脱線します。
エラーをキャッチするために 2 つの異なる方法を試しましたが、どちらも実行結果テーブル (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