Tsql 使用if和UNION ALL的动态查询

Tsql 使用if和UNION ALL的动态查询,tsql,Tsql,我正在尝试编写select语句以将数据插入表中。 我需要从所有以“Centers”开头的数据库中选择数据,并从这些数据库中以“AcctHist”开头的所有表中选择数据。我正在使用交叉联接来获取Databasename.Tablename的所有可能组合。但是,由于所有这些组合都无效,我试图检查select之前是否存在该表。我将此添加为动态查询的一部分。。。但是我得到了if语句之间的并集。 是否可以从CTE中仅选择有效的DB.table组合?在动态查询中不这样做 declare @tsql nva

我正在尝试编写select语句以将数据插入表中。 我需要从所有以“Centers”开头的数据库中选择数据,并从这些数据库中以“AcctHist”开头的所有表中选择数据。我正在使用交叉联接来获取Databasename.Tablename的所有可能组合。但是,由于所有这些组合都无效,我试图检查select之前是否存在该表。我将此添加为动态查询的一部分。。。但是我得到了if语句之间的并集。 是否可以从CTE中仅选择有效的DB.table组合?在动态查询中不这样做

 declare @tsql nvarchar(max)
 set @tsql = ''

 ;with cte_dbtabnames
 as
 (
     select d.name dbname,t.name tbname
      from sys.databases d
      cross join sys.tables t
      where d.name like 'Centers%'
      and t.name  like 'AcctHist%'
 )

  select @tsql = @tsql + case len(@tsql) when 0 then '' else ' UNION ALL '  end +

   'if object_id(''['+ dbname + '].dbo.['+ tbname + ']'') is not null       begin '+ ' select * from [' + dbname + '].dbo.['+ tbname + '] end' 
  from cte_dbtabnames

 select @tsql
 exec(@tsql)

您需要使用系统表根据每个数据库中的表生成动态sql。这段代码应该让你开始

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'select DatabaseName = ''' + name + ''', * from [' + name + '].sys.tables t where t.name like ''AcctHist%'' UNION ALL '
from sys.databases d
where name like 'Centers%'

set @SQL = left(@SQL, len(@SQL) - 10)

select @SQL
--uncomment the exec line below when you are comfortable the dynamic sql is correct.
--exec sp_executesql @SQL