2012-04-12 71 views
0

我已成功编写代码以动态地将多个数据库中的简单选择语句的结果联合起来。我想将数据库名称本身包含为一个字段,以便我可以识别每条记录。修改下面的代码以实现该目标的最佳方法是什么?在动态SQL中包含sys.databases名称作为列UNION

我现在的成绩看起来像

场2,字段3,字段4 B,C,d 2,3,4

我不能告诉哪个数据库包含行(B,C,d )来自。

而且我想确保我看到 字段1,字段2,字段3,字段4 First_DatabaseName,B,C,d Second_DatabaseName,2,3,4

和上面一样,然后我可以看到含(b,C,d)行来自First_Database

DECLARE @sql varchar(max) 

SELECT @sql = ISNULL(@sql + 'union all ',' ') + ' SELECT * FROM ' + name + '.dbo.CombinedProvider ' 
FROM sys.databases 
WHERE name in ('First_DatabaseName', 'Second_DatabaseName') 

EXEC (@sql) 
+0

您是否需要使用Select *或可以显式列出每个数据库的列? – eabraham 2012-04-12 17:05:12

+0

我可以从表格中明确列出我想要的每一列。我仅包含*用于示例目的,不会在生产查询中使用它。 – MSS 2012-04-12 17:28:46

回答

2

只需添加名字到子查询您正在使用:

SELECT @sql = COALESCE(@sql + 'union all ',' ') + ' SELECT '''+name+''' as dbname, c.* FROM ' + name + '.dbo.CombinedProvider c' 
FROM sys.databases 
WHERE name in ('First_DatabaseName', 'Second_DatabaseName') 

顺便问一下,您使用的是不支持的技术做骨料字符串连接。您可能想了解“for xml path('')”作为替代技术。查看http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/了解更多信息,而不是想要了解有关此主题的信息。

+0

这解决了它!当我最初尝试添加名称时,我必须提出语法错误。感谢您指出xml路径链接。我会研究它,并将其纳入我未来的工作。 – MSS 2012-04-16 01:00:48

0

使用“AS”之后的每一列,包括在列中的源分贝名称。

DECLARE @sql varchar(max) 

SELECT @sql = ISNULL(@sql + 'union all ',' ') + ' SELECT ColName as [First_DatabaseName_ColName], ColName2 as [Second_DatabaseName_ColName2], FROM ' + name + '.dbo.CombinedProvider ' 
FROM sys.databases 
WHERE name in ('First_DatabaseName', 'Second_DatabaseName') 

EXEC (@sql) 
+0

感谢您的支持,但要清晰明了,数据库名称或对它的引用不包含在combinedrprovider表中。数据库名称在sysdatabases表中。我想将sys.databases中的'name'字段放入每条记录中。您上面提供的解决方案将数据库的名称作为字段名称的一部分(而不是记录)进行硬编码。它也不起作用,因为查询中的每个字段都有来自两个数据库的记录,但没有标记。 – MSS 2012-04-12 19:05:03