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


     -- =============================================
     -- Author:    sunbird69
     -- Create date: 2007/10/26
     -- ============================================= 

     
    /**//* 
     问题描述:
      平常有时候会对表中某个字段连成了一个字符串的操作,但varchar(8000)最大只能放8000长度的字符串,如果处理超过8000的字符串时,
     应该如何处理,下面针对此提供了一个解决方案,以前看过类似的文章,整理了一下。方案可以根据表的状况动态的创建需求变量的个数。
     
    */

      
    -- 创建测试数据,可以修改变量@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
      DECLARE   @sqlhead   nvarchar(4000),@sqlend   nvarchar(4000)   
      ,
    @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
    =CAST(N','   
      
    +QUOTENAME([name])   
      
    +N'=SUM(CASE   [name]   WHEN   N'   
      
    +QUOTENAME(name,N'''')   
      
    +N'   THEN   [colid]   ELSE   0   END)'   
      
    as   nvarchar(4000))   
      
    INTO   #temp   FROM(   
      
    SELECT   DISTINCT   name   FROM   [syscolumns]   WHERE   name>N'')a   
        
      
    --分组临时表   
      UPDATE   a   SET   @i=id/i,g=@i   
      
    FROM   #temp   a,(SELECT   i=3800/MAX(LEN(a))   FROM   #temp)b   
      
    SET   @ic=@i   
        
      
    --生成数据处理语句   
      SELECT     
      
    @sqlhead=N''''   
      
    +REPLACE(N'SELECT   [xtype]',N'''',N'''''')   
      
    +'''',   
      
    @sqlend=N''''   
      
    +REPLACE(N'   FROM   [syscolumns]   GROUP   BY   [xtype]',N'''',N'''''')   
      
    +N'''',   
      
    @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   #temp   
      EXEC(N
    '+@sqlhead+N'+'+@sql4+N'+N'+@sqlend+N')')   
      
    --删除临时表   
      DROP   TABLE   #temp   

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    js常用方法收集
    Jquery的常用使用方法
    jQuery css()选择器使用说明
    解决IE6,边框问题
    HTML问题集锦及笔记
    我的第一个chrome扩展(3)——继续读样例
    我的第一个chrome扩展(0)——目标
    我的第一个chrome扩展(2)——基本知识
    我的第一个chrome扩展(1)——读样例,实现时钟
    2の奇妙用法
  • 原文地址:https://www.cnblogs.com/Athrun/p/1325989.html
Copyright © 2020-2023  润新知