1

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に等しいテーブルを取得する必要があります。最後のフィルターを記述できますか?これを達成するために別の方法で?

4

1 に答える 1

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フィドル

于 2012-10-14T14:41:27.077 に答える