2012-10-17 179 views
1

全部...我需要一種方法來跨多個數據庫查詢相同的表。我有大約30多個數據庫,他們都有相同的表格。跨多個數據庫查詢表

SELECT 
     a.name 
     , a.address 
     , b.company_id 
     , c.part_no 
     , c.cost 
    FROM accounts a 
    JOIN business b on a.whatever = b.whatever 
    JOIN crazy c ON b.things = c.things 

這樣的事情很簡單,但是跨所有數據庫。重點不在於加入多個數據庫,這很簡單,它同時在所有數據庫上運行。有一種比創建一個長期存儲過程簡單的方法,不是嗎?

回答

3
CREATE PROC dbo.alldatabasequery 
AS 

CREATE TABLE #temp (
databasename varchar(500), 
name varchar(max), 
address varchar(max), 
company_id varchar(max), 
cost varchar(max) 
) 
INSERT INTO #temp 
EXEC sp_MSforeachdb N'IF ''?'' NOT IN (''model'',''tempdb'',''master'',''msdb'') 
    BEGIN 
    SELECT databasename=''?'' 
    , a.name 
    , a.address 
    , b.company_id 
    , c.part_no 
    , c.cost 
    FROM ?.dbo.accounts a 
    JOIN ?.dbo.business b 
    on a.whatever = b.whatever 
    JOIN ?.crazy c 
    ON b.things = c.things 
    END' ; 

SELECT * FROM #temp 


GO 

EXEC dbo.alldatabasequery 
+1

可以跳過像EXEC sp_MSforeachdb N'IF '一些數據庫'? '' NOT IN( '' 模式 '', '' tempdb中 '', '' 主人 '', '' MSDB '' ) BEGIN select''?'' END' ; –

+0

我已經嘗試過EXEC sp_MSforeachdb以前沒有成功......雖然它拉出所有數據,但它也將數據拉入不同的結果網格,其中我需要將它們全部放在一個網格中。我會嘗試這個。 – PuroRock

+0

創建一個臨時表,然後插入它,然後從該臨時表中選擇 –

0

試試這個

CREATE TABLE #temp (
databasename varchar(500), 
name varchar(max), 
address varchar(max), 
company_id varchar(max), 
cost varchar(max) 
) 


DECLARE @statement varchar(max)='' 

    declare cur cursor FOR 
select name 
    from master.dbo.sysdatabases 
    where dbid >4 

     open cur 

DECLARE @name VARCHAR(8000) 


     fetch next from cur into @name 

     while @@fetch_status = 0 

     begin 

    SET @statement='SELECT databasename='''[email protected]+''', a.name 
    , a.address 
    , b.company_id 
    , c.part_no 
    , c.cost 
    FROM '[email protected]+'.dbo.accounts a 
    JOIN '[email protected]+'.dbo.business b 
    on a.whatever = b.whatever 
    JOIN '[email protected]+'.crazy c 
    ON b.things = c.things' 

    INSERT INTO #temp 
    EXEC (@statement) 
    fetch next from cur into @name 
    end 
    close cur 
    deallocate cur 

SELECT * FROM #temp 
+0

動態SQL最近運行得非常有效,它不像原生sql那麼快,但是這是非常易讀和可維護的。你應該放棄'FETCH'。只需使用'SELECT @sql = @sql +'select * FROM ['name +'] .dbo。[Table]'+ char(13)FROM sys.databases'。每條記錄都會附加到變量中。你也可以'exec sp_executesql @ sql'來啓動它,而不是隻生成一個生成腳本的sp。 – jTC