【发布时间】:2021-01-21 09:34:45
【问题描述】:
我有一组具有相同前缀和相同结构的表格。我所需要的只是将它们“组合”成一个。
use thisdb
declare @maxrow int, @result nvarchar(4000), @tempname nvarchar(20)
set @maxrow = (select count(*) from information_schema.tables where table_schema = 'dbo' and table_name like N'AAbc%')
set @result = ''
set @tempname = 'mytemp'
select @result = @result + case when [row] = 1 then replace([name],'from',concat('into ##',@tempname, ' from')) when [row] = @maxrow then replace([name],'union all','') else [name] end + ' '
from
(select ['table_name,'] union all') as [name], row_number() over(order by table_name asc) as [Row]
from information_schema.tables
where table_schema = 'dbo' and table_name like N'AAbc%') x
execute sp_executesql @result
基本上我从information_schema.tables 中检索具有特定模式的表,然后去掉最后一个union all。
上述方法适用于 20-30 个表,因为 @result 不会超过 nvarchar 的限制。但是我很好奇如果表 N 的数量很大,如何完成这项工作?或者有更好的方法来处理这个问题?
【问题讨论】:
-
您好,请在您的标签列表中添加您的 DBMS
-
我认为真正的问题是您为什么要这样做,尤其是对于 30 多张桌子
-
用这些表的联合创建一个视图(例如,可以在 excel 中生成脚本)并使用单个对象通过普通 SQL 访问,而不是动态的
-
“我有一组具有相同前缀和相同结构的表。” 这听起来像是一个设计缺陷,如果你有 30 个具有相同设计的表,为什么它们不是一个(分区)表?
-
"上述方法适用于 20-30 个表,因为
@result不会超过nvarchar的限制"nvarchar最多可以有 1 个十亿~ 个字符(2GB 的文本),如果达到限制,您有 远 超过 30 个表。
标签: sql sql-server union prefix