В хранимой процедуре, как перейти к следующему оператору запроса, даже если предыдущий оператор не выполняется - PullRequest
0 голосов
/ 22 апреля 2019

Я надеюсь, что кто-то может дать мне представление о том, как справиться с этой ситуацией.У меня есть хранимая процедура, которая обновляет различные таблицы.Некоторые запросы требуют подключения к различным связанным серверам.Иногда эти связанные серверы не работают, и мне нужно, чтобы процедура все равно выполняла следующие операторы.Ниже приведен пример:

--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 ]

1 голос
/ 22 апреля 2019

Вы, вероятно, можете делать то, что хотите, с 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;

Обрабатывает ошибки времени выполнения . Если у вас есть ошибки компиляции времени - например, таблицы не существуют или столбцы не совпадают между таблицами, то это не поможет.

0 голосов
/ 22 апреля 2019

даже это будет работать: @@ ROWCOUNT - это эквивалент Oracle для rowl count

--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 
0 голосов
/ 22 апреля 2019

Если бы это запускалось, скажем, из ssms как набор обычных запросов, я бы поместил разделители пакетов между каждым из них, чтобы обрабатывать их отдельно.Однако, поскольку это хранимая процедура, вы не можете сделать это.Одним из способов обойти это может быть создание одной хранимой процедуры для каждого запроса и размещение их всех в качестве шагов внутри задания агента SQL Server.Вы запускаете задание, и каждый шаг выполняется по порядку сверху вниз, даже если некоторые в середине терпят неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...