在所有数据库上运行存储过程,并将所有结果保存到表中

时间:2014-06-18 20:20:35

标签: sql sql-server stored-procedures sp-msforeachdb

我正在尝试创建一个查询,在该查询中,我遍历服务器中的所有数据库,在其上运行存储过程,并将其保存到结果表中。

这就是我到目前为止:

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 个答案:

答案 0 :(得分:0)

按如下方式更新您的代码,应该这样做:

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'