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 表的第二条语句。

我想知道如何修改 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 回答