在动态SQL UNION中包含sys.databases name作为列

时间:2012-04-12 16:56:15

标签: sql database dynamic union

我已成功编写代码,可以跨多个数据库动态联合简单select语句的结果。我想将数据库名称本身包含在一个字段中,以便我可以识别每条记录。修改下面的代码以实现这一目的的最佳方法是什么?

我目前的结果看起来像

field2,field3,field4 B,C,d 2,3,4-

我无法分辨包含(b,c,d)的行来自哪个数据库。

我想确保看到 field1,field2,field3,field4 First_DatabaseName,b,c,d Second_DatabaseName -1,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)

2 个答案:

答案 0 :(得分: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/以获取有关此主题的更多信息。

答案 1 :(得分: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)