&引用;当其他人则为空时“;在SQLServer2005中

&引用;当其他人则为空时“;在SQLServer2005中,sql,sql-server-2005,Sql,Sql Server 2005,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

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)
)失败,则不会执行作用于第二个表的第二条语句

我想知道如何修改SQL Server 2005代码,以便跳过任何错误(在Oracle中,我会说,
,而其他代码则为NULL

我怎样才能做到这一点


提前感谢您的帮助。

我不能建议您抑制错误,但如果您确实想这样做,我想您可以尝试:

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
(请参阅)

您可以将每条语句放入自己的作业步骤中,然后定义发生故障时每个步骤的操作(停止执行、通过电子邮件通知、继续等)我只能使用一个工作步骤,所有代码都在里面。非常感谢您的友好合作。回答接受!再次感谢您的sp_抑制_错误程序!有用!!