0

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

我目前的结果看起来像

字段 2、字段 3、字段 4 b、c、d 2、3、4

我不知道包含 (b,c,d) 的行来自哪个数据库。

我想确保我看到 field1, field2, field3, field4 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)
4

2 回答 2

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/了解更多关于此主题的信息。

于 2012-04-13T19:05:16.147 回答
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)
于 2012-04-12T17:45:14.307 回答