SQL跨多个数据库运行查询

时间:2015-12-07 10:47:57

标签: sql sql-server multiple-databases

我希望在多个数据库上运行查询。我已经看过这个功能了;

sp_MsForEachDb

哪个好,但它贯穿所有数据库,我只想使用其中的一些。有没有办法选择运行哪些数据库?同样在这些数据库中,我们有分支(因此所有表都有BranchID列)。例如,数据库1可能有分支4,5和6,我们只需要分支5.数据库2也可能有分支4,5和6,但在这一个我们想要分支4和5.有没有办法选择哪个根据正在运行的数据库运行分支?

这可以在SSIS或类似的东西上完成吗?

希望这是有道理的!

1 个答案:

答案 0 :(得分:1)

我使用一个简单的游标来完成这个....它非常简单,您可以在数据库列表中运行任何语句。

    --Drop temporary tables if they already exists.
IF OBJECT_ID('tempdb..#DatabaseNames') IS NOT NULL
    DROP TABLE #DatabaseNames

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

--Create a temporary table.
CREATE TABLE #DatabaseNames
(
    DBName varchar(100),
    Active bit
)

GO

--Create a temporary table to store results.
CREATE TABLE #Results
(
    FirstName varchar(100),
    WebLogin varchar(100)
)

GO

--It's the long way to do this but just showing for the sake of the example.
INSERT INTO #DatabaseNames
VALUES ('Database1', 1)

INSERT INTO #DatabaseNames
VALUES ('Database2', 0)

INSERT INTO #DatabaseNames
VALUES ('Database3', 1)

INSERT INTO #DatabaseNames
VALUES ('TIER1', 1)

INSERT INTO #DatabaseNames
VALUES ('Northwind', 1)

DECLARE @DBName varchar(20)
DECLARE @SQL   varchar(2000)

--Start cursor
DECLARE LoopCursor CURSOR FOR
    SELECT DBName AS 'DBName'
    FROM #DatabaseNames
    WHERE DBName NOT IN ('TIER1', 'Northwind')
    AND Active = 1

    OPEN LoopCursor

    FETCH NEXT FROM LoopCursor
    INTO @DBName

    WHILE @@FETCH_STATUS = 0
    BEGIN

        SET @SQL = '
        INSERT INTO #Results
        SELECT FirstName, WebLogin
        FROM ' + @DBName + '.dbo.Users
        WHERE FirstName = ''User1''
        AND LastName = ''User1''
        AND WebLogin = ''User1Login'''

        EXEC(@SQL)
        --Print @DBName

        FETCH NEXT FROM LoopCursor
        INTO @DBName
    END

    SELECT *
    FROM #Results

    CLOSE LoopCursor
    DEALLOCATE LoopCursor

我再次修改了我的答案,继续你最后的评论,想要将所有结果放在一个表格中。您可以添加另一个临时表,只需将数据插入其中即可。完成后,在关闭光标之前从该表中选择。至于在WHERE子句中有多个条件,您可以用2个单引号括起单引号,因此WHERE name = 'MyName'变为WHERE name = ''MyName''

顺便说一下,我的游标并不是最友好的CPU,而且最不喜欢使用它们,但它们有它们的位置。我并不是说这是最佳解决方案,但效果很好。我们有超过75个客户数据库,都具有相同的结构,我每天使用它来更新用户字段和其他表字段。它在很多数据库上执行如此多的语句时运行速度非常快。