t-sql - 组合表元数据和列值

时间:2012-10-14 13:19:34

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

我正在尝试用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”的列的值(肯定存在于所有表中)等于3.是否可以写入最后一个过滤器以不同的方式完成此操作?

1 个答案:

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