我有一个带有数百个相同数据库的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
答案 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)
希望这对您有帮助...