2012-10-31 31 views
0

tracking_table聲明爲日誌表如下:「WHEN OTHERS THEN NULL」 在SQL Server 2005中

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表中的第二語句將不會被執行。

我想知道如何修改SQL Server 2005代碼,以便跳過任何錯誤,前進(在Oracle中我會說,WHEN OTHERS THEN NULL)。

我怎麼能做到這一點?

非常感謝您的幫助。

+1

您可以將每個語句放入其自己的作業步驟中,然後定義如果發生故障時要對每個步驟執行的操作(停止執行,通過電子郵件通知,繼續等等) –

+0

我不得不只使用一個內部所有代碼的作業步驟。 – UltraCommit

回答

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(請參閱Dynamic SQL - EXEC(@SQL) versus EXEC SP_EXECUTESQL(@SQL)

+0

非常感謝您的合作。接受答案! – UltraCommit

+0

再次感謝您的sp_Suppress_Errors過程!有用!! – UltraCommit