物料编码       备注
R0116011493    R608 R609
A0116012226    A07 A33 D55
“备注”里数据值之间是用空格隔开的,现要实现截取后分行显示存入表T1中,如下结果
T1:
物料编码         备注
R0116011493      R608
R0116011493      R609
A0116012226      A07
A0116012226      A33
A0116012226      D55请给出详细代码,谢了~

解决方案 »

  1.   

    var
      sl:TStringList;begin
      sl:=TStringList.Create;
      Sl.DelimitedText:='是我的 是他的 同一个';
      For i:=1 to Sl.Count-1 do
      begin
        //接收返回结果
        Reslt:=sl.Strings[0]+' '+Sl.Strings[i];//是我的 是他的
                                                     //是我的 同一个  
      end;
      

  2.   

    寫一個sql函數
    create function f_split(@SourceSql varchar(8000))
    returns @temp table(a varchar(100))
    as 
    begin
        declare @i int
        set @SourceSql=rtrim(ltrim(@SourceSql))
        set @i=charindex(',',@SourceSql)
        while @i>=1
        begin
            insert @temp values(left(@SourceSql,@i-1))
            set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
            set @i=charindex(',',@SourceSql)
        end
        if @SourceSql<>','
           insert @temp values(@SourceSql)
        return 
    end
     
      

  3.   

    參考:在程序中我们可能经常会遇到这种情况,比如要取一个listbox里面的选择项,得到的结果可能是string ID="id1,id2,id3,id4",然后我们要把这些ID插入到数据库中,同时每个id对应的是要插入一条记录。实现的方法有很多,但是如果我们通过下面这个函数(RecurrentSplit)就能简单的达到上述效果。RecurrentSplit的使用也非常简单。例如:select row_number()over(order by indexno desc) as seq ,* from recurrentsplit('1,2,3,4,5,',',',0,0)
    这样我们就会分成5条记录,因为我的要求是一个listbox中item[i]其中最小的说明他的排序在最前头,同时排序是但SEQ的降序排列。所以在这个查询中我用row_number()over(order by indexno desc) as seq得出了他的顺序号如下seq indexno   SplitName1        4          5
    2        3          4
    3        2          3
    4        1          2
    5        0          1
    然后就是对这个结果进行操作咯如 --设置选择商品为推荐并按传入的降序将商品推荐排序    
    update zp_auction_mst 
             set ishot=1,hotseq = b.seq
            from zp_auction_mst a,
             (select row_number()over(order by indexno desc) as seq ,* from recurrentsplit(@AuctionID,',',0,0)) as b
             where a.auctionid= b.splitName
    搞定,就是这么简单了。CREATE FUNCTION [dbo].[RecurrentSplit]
    (
    @nvStr nvarchar(2000)  --需要分割字符串
    ,@vSeparte varchar(50)  --分割字符串
    ,@iIsHaveSeparte int   --是否显示字符串
    ,@iIsBefore int    --是否是后面的分割符(分割字符分割的顺序)
    )
    RETURNS @Split table 
    (
    IndexNo int default(0)   --流水号
    ,SplitName nvarchar(1000)  --分割后字符串
    )
    AS
    BEGIN
     if(charindex(@vSeparte,@nvStr)<=0) --处理在整个字符串里都没有要分割,也就是字符串本身
     begin
      insert into @Split(SplitName) values(@nvStr)
      return
     end
     declare @iSeparteLen int
     ,@iEndHave int --最后几个字符串是否是分割字符
     ,@iStartHave int --前面几个字符串是否是分割字符
     select @iSeparteLen=len(@vSeparte)
     ,@iStartHave=0
     ,@iEndHave=0
     ,@iIsHaveSeparte=case when @iIsHaveSeparte is null --默认值
      then 0 
      else @iIsHaveSeparte 
      end
     ,@iIsBefore=case when @iIsBefore is null --默认值
      then 0 
      else @iIsBefore 
      end
     if(@iIsBefore=1) --只有在处理前面字符串分割时才用
     begin
      if(left(@nvStr,@iSeparteLen)<>@vSeparte)--处理前面几个分割字符一定是分割字符,不是就加
      begin
       select @nvStr=@vSeparte+@nvStr
       ,@iStartHave=1
      end
     end
     if(right(@nvStr,@iSeparteLen)<>@vSeparte)--处理最后几个分割字符一定是分割字符,不是就加
     begin
      select @nvStr=@nvStr+@vSeparte
      ,@iEndHave=1
     end; --分号一定不能少,因为用了with,是用公用表达式,在其前面一定要加;
     
     with CharCET(CharStr,StrLen,IndexNo)
     as
     (
      select substring(@nvStr,0
      ,case when @iIsBefore=0 then charindex(@vSeparte,@nvStr)+@iSeparteLen
      else charindex(@vSeparte,@nvStr,charindex(@vSeparte,@nvStr)+@iSeparteLen) end
      ) CharStr
      ,case when @iIsBefore=0 then charindex(@vSeparte,@nvStr) 
      else charindex(@vSeparte,@nvStr,charindex(@vSeparte,@nvStr)+@iSeparteLen) end StrLen
      ,0 IndexNo  --第一次初始化
      union all
      select substring(@nvStr
      ,case when @iIsBefore=0 then StrLen+@iSeparteLen 
      else StrLen end
      ,charindex(@vSeparte,@nvStr,StrLen+@iSeparteLen)-StrLen) CharStr 
      ,charindex(@vSeparte,@nvStr,StrLen+@iSeparteLen) StrLen
      ,IndexNo+1 IndexNo --进行递归分割字符串
      from CharCET
      where StrLen<len(@nvStr)-@iSeparteLen --处理递归结束语句,也就是不要让其生成无限弟归下去
     )
     insert into @Split(IndexNo,SplitName)
     select IndexNo,case when @iIsHaveSeparte=0 
      then replace(CharStr,@vSeparte,'') 
      else CharStr 
      end CharStr
     from CharCET
     option(maxrecursion 0) 
      
     if(@iIsHaveSeparte=1) --是否显示分割字符串
     begin
      update @Split --处理前面的分割字符串
      set SplitName=case when @iStartHave=1 
       then replace(SplitName,@vSeparte,'') 
       else SplitName 
       end
      where IndexNo = 0  update @Split --处理后面的分割字符串
      set SplitName=case when @iEndHave=1 
       then replace(SplitName,@vSeparte,'') 
       else SplitName 
       end
      where IndexNo = (select Max(IndexNo) from @Split)
     end
     RETURN 
    END