Dynamic SQL - 联合所有表(表的数量是动态创建的)
Dynamic SQL - union all tables (number of tables is dynamically created)
我不知道如何将所有 table 与动态 SQL 合并。
问题是我在数据库中插入了一些 tables - 都具有相同的结构(只有一个 varchar 列
[Line]
)。我不知道那会是插入的 table 的数量——这取决于项目。但我想在 SQL 中自动执行该过程。
我正在使用此查询来查找那些 table,另外我添加了一些 [RowNum] 可以作为每个 table 的 ID:
SELECT
ROW_NUMBER() OVER (ORDER BY Name) AS [RowNum],
[Name] AS [Name]
INTO #all_tables_with_ids
FROM #all_tables
这个查询 returns:
RowNum | Name
------------------------
1 | Table 1
2 | Table 2
3 | Table 3
4 | Table 4
我想将所有 table 合并在一起。我试图在 while 循环中写入一些插入,但它没有用。我发现我需要动态 SQL。
你能推荐点什么吗?我试图找到一些例子,但由于 tables 的列表一开始是未知的,所以它们都失败了,所以它也需要动态创建。
create table #test
(
RowNum int,
Name varchar(100)
)
insert into #test
select 1,quotename('table1')
union all
select 2,quotename('table2')
declare @sql nvarchar(max)
set @sql='select somecol from tbl union all '
declare @sql1 nvarchar(max)
;with cte
as
(select @sql as ql,name,rplc
from
#test t1
cross apply
(select replace(@sql,'tbl',name) as rplc from #test t2 where t1.rownum=t2.rownum)b
)
select @sql1= stuff(
(select ''+rplc
from cte
for xml path('')
),1,0,'')
set @sql1=substring(@sql1,1,len(@sql1)-10)
print @sql1
--exec(@Sql1)
我不知道如何将所有 table 与动态 SQL 合并。 问题是我在数据库中插入了一些 tables - 都具有相同的结构(只有一个 varchar 列
[Line]
)。我不知道那会是插入的 table 的数量——这取决于项目。但我想在 SQL 中自动执行该过程。
我正在使用此查询来查找那些 table,另外我添加了一些 [RowNum] 可以作为每个 table 的 ID:
SELECT
ROW_NUMBER() OVER (ORDER BY Name) AS [RowNum],
[Name] AS [Name]
INTO #all_tables_with_ids
FROM #all_tables
这个查询 returns:
RowNum | Name
------------------------
1 | Table 1
2 | Table 2
3 | Table 3
4 | Table 4
我想将所有 table 合并在一起。我试图在 while 循环中写入一些插入,但它没有用。我发现我需要动态 SQL。
你能推荐点什么吗?我试图找到一些例子,但由于 tables 的列表一开始是未知的,所以它们都失败了,所以它也需要动态创建。
create table #test
(
RowNum int,
Name varchar(100)
)
insert into #test
select 1,quotename('table1')
union all
select 2,quotename('table2')
declare @sql nvarchar(max)
set @sql='select somecol from tbl union all '
declare @sql1 nvarchar(max)
;with cte
as
(select @sql as ql,name,rplc
from
#test t1
cross apply
(select replace(@sql,'tbl',name) as rplc from #test t2 where t1.rownum=t2.rownum)b
)
select @sql1= stuff(
(select ''+rplc
from cte
for xml path('')
),1,0,'')
set @sql1=substring(@sql1,1,len(@sql1)-10)
print @sql1
--exec(@Sql1)