【问题标题】:Include sys.databases name as column in dynamic SQL UNION在动态 SQL UNION 中包含 sys.databases 名称作为列
【发布时间】:2012-04-25 01:43:07
【问题描述】:

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

我目前的结果是这样的

字段 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)

【问题讨论】:

  • 需要使用 Select * 还是可以显式列出每个数据库的列?
  • 我可以从表格中明确列出我想要的每一列。我只包含 * 用于示例目的,不会在生产查询中使用它。

标签: sql database dynamic union


【解决方案1】:

只需将名称添加到您正在使用的子查询中:

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

【讨论】:

  • 这样就解决了!当我最初尝试添加名称时,我一定犯了语法错误。感谢您指出 xml 路径链接。我会研究它并将其融入我未来的工作中。
【解决方案2】:

在每列后使用“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)

【讨论】:

  • 感谢您,但为了清楚起见,combinedrprovider 表中“不”包含数据库名称或对它的引用。数据库名称位于 sysdatabases 表中。我想将 sys.databases 中的“名称”字段拉到每条记录中。您在上面提供的解决方案将数据库名称硬编码为字段名称的一部分(而不是记录)。它也不起作用,因为查询中的每个字段都有来自两个数据库的记录,但没有这样标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多