您的位置:首页 > 数据库

动态sql语句超过8000个字符的处理方法

2008-04-14 09:50 555 查看
临时表+动态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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: