来自N个SQL Server数据库的UNIONing结果

时间:2019-09-04 15:25:51

标签: sql sql-server union

我有一个带有数百个相同数据库的SQL Server。我需要能够获取数据库的子集并针对第一个数据库进行查询,然后将其与第二个数据库,第三个数据库等等结合。我需要返回的结果只是来自所有选定数据库的一组数据。

我想避免(如果有可能的话),方法是输出一个脚本,然后运行该脚本或创建一个临时表并插入值。我认为指针是我最好的,但不是很确定。...

-- doesn't have to be like this, but this is an example of 
-- one way I might attack the problem
DECLARE C_CURSOR CURSOR FOR 
    SELECT [Name] 
    FROM sys.databases 
    WHERE name like 'b%_db'
    ORDER BY name

DECLARE @DB_Name AS NVARCHAR(200)

OPEN C_CURSOR

FETCH NEXT FROM C_CURSOR INTO @DB_Name

WHILE(@@FETCH_STATUS = 0)
BEGIN
    SELECT @DB_Name AS DbName, P.PersonID, P.FirstName, P.LastName, P.Email    
    FROM People P

    -- UNION?? (doesn't work, but something along the lines of that)?

    FETCH NEXT FROM C_CURSOR INTO @DB_Name
END

CLOSE C_CURSOR

我希望得到的结果类似于(表示为CSV)

DbName, PersonID, FirstName, LastName, Email
DB1, Guid1, Joe, Schmoe, joe@schmoe.com
DB1, Guid2, Jack, Spratt, jack.s@gmail.com
DB2, Guid3, John, Doe, john.doe.lives@gmail.com

2 个答案:

答案 0 :(得分:0)

您可以创建一个临时表

CREATE TABLE #results (
  DbName sysname not null COLLATE DATABASE_DEFAULT,
  PersonID uniqueidentifier not null,
  FirstName nvarchar(128) NOT NULL COLLATE DATABASE_DEFAULT,
  LastName nvarchar(128) NOT NULL COLLATE DATABASE_DEFAULT,
  Email nvarchar(255) NOT NULL COLLATE DATABASE_DEFAULT
)

在您的光标中,将SELECT结果插入此临时表中。

最后SELECT * FROM #results;

答案 1 :(得分:0)

通常的方法是使用临时表或将它们合并为多租户表,但是这里有一个示例解决方法:

declare @Complete varchar(max)
select @Complete = coalesce(@Complete+' Union ', '') + concat('select ''' + [name] + ''', P.PersonID, P.FirstName, P.LastName, P.Email  from ',[name],'..','People P') from sys.databases where name like 'b%_db' ORDER BY name

exec (@Complete)

希望这对您有帮助...

相关问题