我已成功编写代码,可以跨多个数据库动态联合简单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)
答案 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)