-- 执行脚本如果是一个表就会有184,756行结果,问题:如何自动平分生成50个表,请专家答疑解惑
;WITH t AS
(
SELECT TOP 20 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjects
)
SELECT [ID]=Identity(INT,1,1),concat_ws(' ',a.rn,b.rn,c.rn,d.rn,e.rn,f.rn,g.rn,h.rn ,i.rn,j.rn) as notext
INTO [#tb66]
FROM T a
JOIN t b ON a.rn<b.rn
JOIN t c ON b.rn<c.rn
JOIN t d ON c.rn<d.rn
JOIN t e ON d.rn<e.rn
JOIN t f ON e.rn<f.rn
JOIN t g ON f.rn<g.rn
JOIN t h ON g.rn<h.rn
JOIN t i ON h.rn<i.rn
JOIN t j ON i.rn<j.rn
declare @i int,@k int
declare @sql nvarchar(max)
select @i=count()/50+1 from #tb66
set @k=0
while @k<50
begin
select min(id),max(id) from #tb66
where id between @i@k+1 and @i*(@k+1)
set @k=@k+1
end
每个表的最小ID和最大ID给你算出来了,至于怎么弄到50个表里面,在循环内用动态语句去处理就好
不用循环也可以。
declare @i int
declare @sql nvarchar(max)
select @i=count()/50+1 from #tb66
select 'insert into table'+left(number+1,2)+' from #tb66
where id between '+ left( number@i+1,10)+' and '+ left((number+1)*@i,10)
from master..spt_values where type='P' and number between 0 and 49
同样能求出来最小ID和最大ID,分组为NUMBER+1,生成插入脚本
取表中元素个数,除以50,结果就是新表中元素个数,但是存在51个元素和99个元素的问题,就是余数是0~49,该如何考虑
51个元素,每个表1个元素,最后一个表是2个,也可以第一个表2个,后面每个1个
99个元素时,最佳方案是前面每个表2个,最后一个表1个,如果前面每个表1个元素时,后面表会剩49,肯定不合理
因此余数不为0时,考虑根据余数个数进行上取整,前面表每个增加i1个元素,直到余数的个数结束,后面的表直接取整
举例的是20选10的组合(不是全排列)总共有184756行元素,如何让脚本自动生成50个表,而不是 生成表以后再去拆分成50个表,不存在51个元素和99个元素的问题
尝试执行以下脚本 但不行
;WITH CTE AS(SELECT ROW_NUMBER()OVER(ORDER BY GETDATE()) -1 RN,* FROM #tb66)
,Nrs AS (
SELECT TOP ((SELECT COUNT(1)+COUNT(1)/50 FROM Cte)) ROW_NUMBER()OVER(ORDER BY GETDATE())-1 AS Nr FROM sys.columns AS a,sys.columns AS b,sys.columns AS c,sys.columns AS d
)
SELECT *
FROM Nrs T1 LEFT JOIN CTE T2 ON T1.Nr%6=T2.RN%5 AND T1.Nr/6=T2.RN/50 ORDER BY T1.Nr
最好的方式使用后台代码处理,根据记录范围+创建表结构 然后数据插入就可以了。不过这样的意义不大 。问题要切合实际。