简体   繁体   English

跨多个数据库查询表

[英]Query tables across multiple databases

All... I need a way to query identical tables across multiple databases. 所有......我需要一种方法来跨多个数据库查询相同的表。 I have roughly 30+ databases and they all have identical tables. 我有大约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

Something simple like this, but across all databases. 像这样简单,但在所有数据库中。 The focus isn't joining on multiple databases, that's simple, it's running this across all databases simultaneously. 重点不是加入多个数据库,这很简单,它同时在所有数据库中运行。 There's got to be a simpler way than creating a long drawn out stored procedure, no? 必须有一个比创建一个冗长的存储过程更简单的方法,不是吗?

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 

try this one 试试这个

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='''+@name+''', a.name
    , a.address
    , b.company_id
    , c.part_no
    , c.cost
    FROM '+@name+'.dbo.accounts a
    JOIN '+@name+'.dbo.business b 
    on a.whatever = b.whatever
    JOIN '+@name+'.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 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM