在存储过程中,即使前一条语句失败,如何跳到下一条查询语句

时间:2019-04-22 15:14:00

标签: sql sql-server ssms

我希望有人能给我一个关于如何处理这种情况的想法。我有一个存储过程可以更新各种表。某些查询需要连接到其他链接的服务器。有时那些链接的服务器已关闭,无论如何,我都需要该程序仍然运行下一条语句。下面是一个示例:

--Stored Procedure
BEGIN 
    INSERT INTO table1
        SELECT *
        FROM Z1;

    -- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY
    INSERT INTO table1
        SELECT *
        FROM Z2;

    -- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY
    INSERT INTO table1
        SELECT *
        FROM Z3;
END

3 个答案:

答案 0 :(得分:1)

您可以使用TRY / CATCH块来做您想做的事情:

BEGIN
    BEGIN TRY
        INSERT INTO table1 SELECT * FROM Z1;
    END TRY
    BEGIN CATCH
        -- you can do something here if you want
    END CATCH;

    -- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY

    BEGIN TRY
        INSERT INTO table1 SELECT * FROM Z2;
    END TRY
    BEGIN CATCH
        -- you can do something here if you want
    END CATCH;

    -- IF ABOVE FAILS GO TO NEXT QUERY ANYWAY

    BEGIN TRY
        INSERT INTO table1 SELECT * FROM Z3;
    END TRY
    BEGIN CATCH
        -- you can do something here if you want
    END CATCH;
END;

这处理运行时错误。如果您有 compile 时间错误-例如表不存在或表之间的列不匹配,那么这将无济于事。

答案 1 :(得分:0)

如果这是从一堆普通查询中说出的ssms运行的,那么我将在它们之间放置批处理分隔符以将其分开处理。但是,由于这是一个存储过程,所以您不能这样做。解决该问题的一种方法是为每个查询创建一个存储过程,并将所有过程作为步骤放入SQL Server代理作业中。您可以运行作业,即使中间的某些步骤失败,每个步骤也会从上到下依次执行。

答案 2 :(得分:0)

这也将起作用:@@ ROWCOUNT与oracle等效于sql%rowcount

--Stored Procedure
BEGIN 
    INSERT INTO table1
        SELECT *
        FROM Z1;


    IF @@ROWCOUNT <>1 
    INSERT INTO table1
        SELECT *
        FROM Z2;

    IF @@ROWCOUNT <>1 
    INSERT INTO table1
        SELECT *
        FROM Z3;
END