Выполнение хранимой процедуры на всех базах данных и сохранение всех результатов в таблицу

Я пытаюсь создать запрос, в котором я перебираю все базы данных на сервере, запускаю хранимую процедуру на нем и сохраняю его в таблицу результатов.

Это то, что я до сих пор:

CREATE table results (Severity INT, PurchaseOrderNumber INT,
                      PurchaseOrderLineNumber SMALLINT, ShipmentNumber SMALLINT,
                      ErrorCode int, ErrorText VARCHAR(256), DateCreated datetime)

EXECUTE sp_msForEachDB '
    IF "?" LIKE "VIS%"
        BEGIN
            USE "?"
            INSERT INTO results EXECUTE IC_PURCHASEORDER
        END
    '
SELECT * FROM results

DROP TABLE results

С помощью этого кода я надеюсь выполнить хранимую процедуру IC_PURCHASEORDER над всеми базами данных на сервере и записать результат в созданную таблицу результатов. После этого я смогу отправить эти результаты по электронной почте руководителю, а затем отбросить таблицу, но это работа для другого дня. Я знаю, что в операторе IF существует синтаксическая ошибка, которая приводит к следующей ошибке

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near '{insert database name here}'.

Можно ли получить некоторое представление о том, чего я пытаюсь достичь? Спасибо!

1 ответ

Решение

Обновите ваш код следующим образом, следует сделать свое дело:

CREATE table results (Severity INT, PurchaseOrderNumber INT,
                          PurchaseOrderLineNumber SMALLINT, ShipmentNumber SMALLINT,
                          ErrorCode int, ErrorText VARCHAR(256), DateCreated datetime)

    exec sp_msForEachDB 'use [?];
                    if ''?'' like ''vis%''
                    begin
                        if object_id(''IC_PURCHASEORDER'') is not null
                        begin
                             INSERT INTO results EXECUTE IC_PURCHASEORDER
                        end
                        else
                        begin
                             print ''missing proc in ?''
                        end
                    end'

    SELECT * FROM results

    DROP TABLE results

Простой тест... запустите это, он покажет вам все базы данных как "%a%":

exec sp_msForEachDB 'use [?];
                    if ''?'' like ''%a%''
                    begin
                        select ''? is like a''
                    end
                    else
                    begin
                        select ''? is not like a''
                    end'
Другие вопросы по тегам