簡體   English   中英

跨多個數據庫的SQL Run查詢

[英]SQL Run query across multiple Databases

我想在多個數據庫上運行查詢。 我看過這個功能;

sp_MsForEachDb

可以,但是它遍歷所有數據庫,我只想使用其中的一些。 有沒有一種方法可以選擇運行哪些數據庫? 同樣在這些數據庫中,我們有分支(因此所有表都有一個BranchID列)。 例如,數據庫1可能具有分支4、5和6,而我們只需要分支5。數據庫2可能也具有分支4、5和6,但是在這個數據庫中,我們需要分支4和5。是否有選擇方式根據正在運行哪個數據庫運行分支?

可以在SSIS上執行類似操作嗎?

希望這有道理!

我使用一個簡單的游標來完成此操作。...這非常簡單,您可以針對數據庫列表運行其中的任何語句。

    --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個客戶數據庫,所有客戶數據庫都具有相同的結構,我每天都使用此數據庫來更新用戶字段和其他表字段。 它在許多數據庫上執行如此多的語句時運行得非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM