【问题标题】:t-sql - combine table metadata and column valuest-sql - 结合表元数据和列值
【发布时间】:2012-10-04 15:49:09
【问题描述】:

我正在尝试像这样在 T-SQL 中编写查询:

select *
from
(select t.name tablename
from sys.columns c join sys.tables t on c.object_id = t.object_id
where c.name like 'column1'
) candidatetables
where tablename.column2 = 3

问题出在最后一个过滤器上。我收到此错误“无法绑定多部分标识符“tablename.column2”。”。

此查询应获取其架构中具有列“column1”的表,并且该列的值为“column2”的列的值肯定存在于所有表中。是否可以写最后一个过滤器以不同的方式完成此操作?

【问题讨论】:

  • 那么您希望查询的输出是表名列表,还是希望表中的数据?
  • 首先,我想获取在其架构中具有 column1 的表以及它们的 column2 的给定值。然后我想查询这些表。将其视为一个两步过程。
  • 假设我有表 T1(column1, column2), T2(column1, column2), T3(column1, column2), T4(column4, column2) 此外,假设 T1.column2 = 3, T2。 column2 = 1000,T3.column2 = 3。首先我会得到 T1、T2 和 T3,因为它们的架构中都有 column1。但是在下一步中,我想获取表T1和T3,因为这些表的字段column2的值为3。最后我想从这些表中查询其他字段。希望这更清楚。

标签: generics sql-server-2012 dynamic-sql


【解决方案1】:

您的查询不会查询您找到的表。您必须动态构建一个查询来查询您找到的每个表,然后使用union all 组合结果。

试试这个:

declare @Col2Value int = 3
declare @SQL nvarchar(max)

select @SQL = 
(
  select 'union all '+
         'select top(1) '''+t.name+''' as TableName '+
         'from '+quotename(t.name)+' '+
         'where Column2 = '+cast(@Col2Value as nvarchar(10))+' '
  from sys.columns c
    inner join sys.tables t
      on c.object_id = t.object_id
  where c.name = 'Column1'
  for xml path(''), type
).value('substring(./text()[1], 11)', 'nvarchar(max)')

exec (@SQL)

上面的代码将构建并执行如下所示的查询:

select top(1) 'Table1' as TableName
from [Table1]
where Column2 = 3
union all
select top(1) 'Table2' as TableName
from [Table2] 
where Column2 = 3
union all 
select top(1) 'Table3' as TableName
from [Table3] 
where Column2 = 3 

SQL Fiddle

【讨论】:

  • 这很好用。谢谢。还有两个问题。 1、为什么要把查询结果转换成xml? 2. 如果我有两个动态 SQL(1 和 2),如示例中的一个,它们过滤不同的表,是否可以编写一个查询,将 SQL1 中的表与 SQL2 中的表连接起来,并从这些表中选择一些数据?
  • XML 的东西是一种连接技巧,用于从多行构建一个字符串。对于第二部分,我不明白你想要什么。请更新您的问题或提出新问题。很可能您必须使用此命令的结果来构建一个新的动态 SQL 查询来执行您想要的操作。
  • 我做了我想做的事。我读过有关 for xml 的信息,但我想知道是否存在其他替代方案。谢谢
  • @user1744925 另一种选择是使用游标循环遍历行并在循环中构建动态 SQL。
猜你喜欢
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多