我正在尝试编写一个select语句来将数据插入表中。 我需要选择以'Centers'开头的所有数据库中的数据以及那些以'AcctHist'开头的数据库中的所有表。我正在使用交叉连接来获取Databasename.Tablename的所有可能组合。但是,由于所有这些组合都无效,我试图在select之前检查表是否存在。我在动态查询中添加了这个...但是后来我在if语句之间得到了一个UNION。 是否可以从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)
答案 0 :(得分:1)
您需要使用系统表根据每个数据库中的表生成动态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