0

tracking_tableは、次のように宣言されたログ テーブルです。

create table tracking_table (my_command nvarchar(500), my_date datetime);

SQL Server 2005 ジョブ内で宣言された SQL SERVER 2005 コードの次のブロックがあるとします。

DECLARE @my_statement NVARCHAR(500)  
delete from tracking_table
   SET @my_statement = 'ALTER INDEX ALL ON my_user.dbo.my_fact_table REBUILD WITH (FILLFACTOR = 90)'
insert into tracking_table values (@my_statement,getdate()) 
EXEC (@my_statement)  
 SET @my_statement = 'ALTER INDEX ALL ON my_user.dbo.my_second_table REBUILD WITH (FILLFACTOR = 90)'
insert into tracking_table (@my_statement,getdate())    
EXEC (@my_statement)  

実行時に最初のステートメント ( ALTER INDEX ALL ON my_user.dbo.my_fact_table REBUILD WITH (FILLFACTOR=90)) が失敗すると、my_second テーブルに作用する 2 番目のステートメントは実行されません。

今後、エラーをスキップするために、SQL Server 2005 コードを変更する方法を知りたいです (Oracle では、と言うでしょうWHEN OTHERS THEN NULL)。

どうすればこれを達成できますか?

よろしくお願いいたします。

4

1 に答える 1

2

エラーを抑制するようにアドバイスすることはできませんが、本当にやりたい場合は、次のことを試すことができると思います。

declare @my_statement nvarchar(500)  

begin try
    delete from tracking_table
end try
begin catch
    print null // or errormessage
end catch

begin try
    set @my_statement = 'ALTER INDEX ALL ON my_user.dbo.my_fact_table REBUILD WITH (FILLFACTOR = 90)'

    insert into tracking_table values (@my_statement,getdate()) 
    exec (@my_statement)  
end try
begin catch
    print null // or errormessage
end catch

begin try
    set @my_statement = 'ALTER INDEX ALL ON my_user.dbo.my_second_table REBUILD WITH (FILLFACTOR = 90)'

    insert into tracking_table (@my_statement,getdate())    
    exec (@my_statement)  
end try
begin catch
    print null // or errormessage
end catch

手順を作成することもできます

create procedure sp_executesql_Suppress_Errors
(
     @stmt nvarchar(max)
)
as
begin
    begin try
        exec sp_executesql
            @stmt = @stmt
    end try
    begin catch
        print null // or errormessage
    end catch
end

そして、あなたのステートメントでそれを呼び出します。exec sp_executesqlまた、代わりに使用することをお勧めしますexec(動的 SQL - EXEC(@SQL) と EXEC SP_EXECUTESQL(@SQL)を参照)

于 2012-10-31T06:27:04.700 に答える