2012-10-17 135 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