临时表+动态sql语句
--处理示例
--测试数据
create table #tmp(Fid varchar(10),s Nvarchar(1000))
insert #tmp select left(newid(),8),replace(newid(),'-',',')+replace(newid(),'-',',')+replace(newid(),'-',',')
from sysobjects
go
--处理
declare @sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)
,@i int,@ic nvarchar(10)
--生成数据处理临时表
select id=identity(int,0,1),g=0
,a=N' union select N'+quotename(Fid,N'''')+N',N'''
+replace(s,N',',N''' union select N'+quotename(Fid,N'''')+N',N''')+N''''
into # from #tmp
--分组临时表
update a set @i=id/i,g=@i
from # a,(select i=3800/max(len(a)) from #)b
set @ic=@i
--生成数据处理语句
select @sql1=N'',@sql2=N'',@sql3=N'',@sql4=N''
while @ic>=0
select @sql1=N',@'+@ic+N' nvarchar(4000)'+@sql1
,@sql2=N',@'+@ic+N'=N'''''+@sql2
,@sql3=N',@'+@ic
+N'=case g when '+@ic
+N' then @'+@ic+N'+a else @'+@ic
+N' end'+@sql3
,@sql4=N'+@'+@ic+@sql4
,@ic=@ic-1
select @sql1=stuff(@sql1,1,1,N'')
,@sql2=stuff(@sql2,1,1,N'')
,@sql3=stuff(@sql3,1,1,N'')
,@sql4=stuff(@sql4,1,1,N'')
--执行
exec(N'declare '+@sql1+N'
select '+@sql2+N'
select '+@sql3+N' from #
set @0=stuff(@0,1,7,N'''')
exec('+@sql4+N')')
--删除临时表
drop table #
go
--删除测试
drop table #tmp