您的位置:首页 > 数据库

SQL 处理长度超过8000 的字符串

2007-10-26 13:55 465 查看
-- =============================================

-- Author: sunbird69

-- Create date: 2007/10/26

-- =============================================

-- 创建测试数据,可以修改变量@rc来改变输入数据大小

if exists(select * from sys.objects where object_id=object_id(N'Tb') and type in (N'u'))

begin

drop table Tb

end

create table Tb

(

Tname varchar(300)

)

-- 设置测试数据

declare @c int,

@rc int

select @c=0, -- 循环变量

@rc=10000 -- 设置的行数

while @c<@rc

begin

select @c=@c+1

insert into Tb values('This is a SQL test'+cast(@c as varchar)) -- 创建数据

end

declare @i int, -- 每个变量可以存放多少个数据行

@j int -- 整个表需要多少变量来存放所有的数据行

select @i=max(len(Tname)) from Tb -- 获取所以数据行中需求字段长度最大的值

set @i=7800/@i -- 每个变量可以存放的行数,设置为7800,因为在得到的字符串有可能存放间隔符如','等

print @i -- 测试

select @j=count(*)/@i from Tb -- 得到需求变量的个数,设置为7800,因为在其中有可能存放间隔符如','等

print @j -- 测试

if object_id('tempdb..#') is not null -- 创建临时表

begin

drop table #

end

select id=identity(int,0,1), -- 设置一个自增字段,为分组作准备

Tname, -- 需要的字段

gid=0 -- 分组初始为0

into # from Tb

update # set gid=id/@i -- 设置分组的值

declare @ds varchar(8000), -- 需要字义所以变量的字符串

@hs varchar(8000), -- 给需要的所以变量设置初值

@es varchar(8000), --

@cs varchar(8000), -- 给所以变量逐个设置值

@ts varchar(8000), -- print 打印测试

@ic varchar(10), -- 需求变量编号

@ss varchar(8000) -- select 测试结果

-- 设置变量的初始值

select @ds='',

@hs='select ',

@cs='',

@ts='',

@ss=''

while @j>=0

begin

select @ic=cast(@j as varchar), -- 转换类型

@j=@j-1, -- 控制循环

@ds='@'+@ic+' varchar(8000),'+@ds, -- 设置需求定义变量字符串

@hs=@hs+'@'+@ic+'='''',', -- 给需要的所以变量设置初值的字符串

@cs='select @'+@ic+'=@'+@ic+'+Tname + '','' from # where gid='+@ic+char(13)+@cs, -- 给需求变量逐个设置值

@ts=@ts+'print '+'@'+@ic+';', -- 打印测试字符串

@ss=@ss+'select '+'@'+@ic+' as content'+@ic+';' -- select 测试字符串

-- @ts='+@'+@ic

end

select @ds='declare '+left(@ds,len(@ds)-1)+char(13), -- 增加定义前缀declare

@hs=left(@hs,len(@hs)-1)+char(13), -- 去多余字符

@cs=left(@cs,len(@cs)-1) -- 去多余字符

print @ds -- 测试

print @hs -- 测试

print @cs -- 测试

print @ts -- 测试

print @ss -- 测试

-- 执行结果测试

exec(@ds+@hs+@cs+@ts+@ss)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: