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

时间:2022-12-30 20:35:52
 
 
/*
问题描述: 平常有时候会对表中某个字段连成了一个字符串的操作,但varchar(8000)最大只能放8000长度的字符串,如果处理超过8000的字符串时,
应该如何处理,下面针对此提供了一个解决方案,以前看过类似的文章,整理了一下。方案可以根据表的状况动态的创建需求变量的个数。
*/
SQL 处理长度超过8000 的字符串
SQL 处理长度超过8000 的字符串  -- 创建测试数据,可以修改变量@rc来改变输入数据大小
SQL 处理长度超过8000 的字符串
  if exists(select * from sys.objects where object_id=object_id(N'Tb'and type in (N'u'))
SQL 处理长度超过8000 的字符串    
begin
SQL 处理长度超过8000 的字符串     
drop table Tb
SQL 处理长度超过8000 的字符串    
end
SQL 处理长度超过8000 的字符串  
create table Tb
SQL 处理长度超过8000 的字符串  (
SQL 处理长度超过8000 的字符串   Tname 
varchar(300)
SQL 处理长度超过8000 的字符串  )
SQL 处理长度超过8000 的字符串  
-- 设置测试数据
SQL 处理长度超过8000 的字符串
  declare @c int,
SQL 处理长度超过8000 的字符串    
@rc int
SQL 处理长度超过8000 的字符串  
select @c=0,  -- 循环变量
SQL 处理长度超过8000 的字符串
    @rc=10000 -- 设置的行数
SQL 处理长度超过8000 的字符串
  while @c<@rc
SQL 处理长度超过8000 的字符串   
begin
SQL 处理长度超过8000 的字符串    
select @c=@c+1  
SQL 处理长度超过8000 的字符串    
insert into Tb values('This is a SQL test'+cast(@c as varchar))  -- 创建数据
SQL 处理长度超过8000 的字符串
   end
SQL 处理长度超过8000 的字符串
SQL 处理长度超过8000 的字符串  
declare @i int,    -- 每个变量可以存放多少个数据行
SQL 处理长度超过8000 的字符串
    @j int    -- 整个表需要多少变量来存放所有的数据行
SQL 处理长度超过8000 的字符串

SQL 处理长度超过8000 的字符串  
select @i=max(len(Tname)) from Tb -- 获取所以数据行中需求字段长度最大的值
SQL 处理长度超过8000 的字符串
  set @i=7800/@i      -- 每个变量可以存放的行数,设置为7800,因为在得到的字符串有可能存放间隔符如','等
SQL 处理长度超过8000 的字符串
  print @i       -- 测试
SQL 处理长度超过8000 的字符串
  select @j=count(*)/@i from Tb  -- 得到需求变量的个数,设置为7800,因为在其中有可能存放间隔符如','等
SQL 处理长度超过8000 的字符串
  print @j       -- 测试
SQL 处理长度超过8000 的字符串
  if object_id('tempdb..#'is not null -- 创建临时表
SQL 处理长度超过8000 的字符串
   begin
SQL 处理长度超过8000 的字符串    
drop table #
SQL 处理长度超过8000 的字符串   
end 
SQL 处理长度超过8000 的字符串  
SQL 处理长度超过8000 的字符串  
select  id=identity(int,0,1),   -- 设置一个自增字段,为分组作准备
SQL 处理长度超过8000 的字符串
    Tname,       -- 需要的字段
SQL 处理长度超过8000 的字符串
    gid=0       -- 分组初始为0
SQL 处理长度超过8000 的字符串
  into # from Tb  
SQL 处理长度超过8000 的字符串
SQL 处理长度超过8000 的字符串  
update # set gid=id/@i     -- 设置分组的值 
SQL 处理长度超过8000 的字符串

SQL 处理长度超过8000 的字符串
SQL 处理长度超过8000 的字符串  
declare @ds varchar(8000),    -- 需要字义所以变量的字符串
SQL 处理长度超过8000 的字符串
    @hs varchar(8000),    -- 给需要的所以变量设置初值
SQL 处理长度超过8000 的字符串
    @es varchar(8000),    -- 
SQL 处理长度超过8000 的字符串
    @cs varchar(8000),    -- 给所以变量逐个设置值
SQL 处理长度超过8000 的字符串
    @ts varchar(8000),    -- print 打印测试
SQL 处理长度超过8000 的字符串
    @ic varchar(10),    -- 需求变量编号
SQL 处理长度超过8000 的字符串
    @ss varchar(8000)    -- select 测试结果
SQL 处理长度超过8000 的字符串
  -- 设置变量的初始值
SQL 处理长度超过8000 的字符串
  select  @ds='',
SQL 处理长度超过8000 的字符串    
@hs='select ',
SQL 处理长度超过8000 的字符串    
@cs='',
SQL 处理长度超过8000 的字符串    
@ts='',
SQL 处理长度超过8000 的字符串    
@ss=''
SQL 处理长度超过8000 的字符串  
SQL 处理长度超过8000 的字符串  
while @j>=0
SQL 处理长度超过8000 的字符串   
begin 
SQL 处理长度超过8000 的字符串    
select  @ic=cast(@j as varchar), -- 转换类型
SQL 处理长度超过8000 的字符串
      @j=@j-1,     -- 控制循环
SQL 处理长度超过8000 的字符串
      @ds='@'+@ic+' varchar(8000),'+@ds-- 设置需求定义变量字符串
SQL 处理长度超过8000 的字符串
      @hs=@hs+'@'+@ic+'='''',',   -- 给需要的所以变量设置初值的字符串
SQL 处理长度超过8000 的字符串
      @cs='select @'+@ic+'=@'+@ic+'+Tname + '','' from # where gid='+@ic+char(13)+@cs-- 给需求变量逐个设置值
SQL 处理长度超过8000 的字符串
      @ts=@ts+'print '+'@'+@ic+';'-- 打印测试字符串
SQL 处理长度超过8000 的字符串
      @ss=@ss+'select '+'@'+@ic+' as content'+@ic+';' -- select 测试字符串
SQL 处理长度超过8000 的字符串
      -- @ts='+@'+@ic
SQL 处理长度超过8000 的字符串
   end
SQL 处理长度超过8000 的字符串  
select  @ds='declare '+left(@ds,len(@ds)-1)+char(13), -- 增加定义前缀declare
SQL 处理长度超过8000 的字符串
    @hs=left(@hs,len(@hs)-1)+char(13),    -- 去多余字符
SQL 处理长度超过8000 的字符串
    @cs=left(@cs,len(@cs)-1)      -- 去多余字符
SQL 处理长度超过8000 的字符串

SQL 处理长度超过8000 的字符串  
print @ds  -- 测试
SQL 处理长度超过8000 的字符串
  print @hs  -- 测试
SQL 处理长度超过8000 的字符串
  print @cs  -- 测试
SQL 处理长度超过8000 的字符串
  print @ts  -- 测试
SQL 处理长度超过8000 的字符串
  print @ss  -- 测试
SQL 处理长度超过8000 的字符串

SQL 处理长度超过8000 的字符串  
-- 执行结果测试
SQL 处理长度超过8000 的字符串
  exec(@ds+@hs+@cs+@ts+@ss
-----------------------------------------------------------------------------------------------------------