谁能帮我写个字符串处理的函数,要求它可以处理类似"aa1|bb1|pst|ee|fsd"的字符串,串中"|"和它分隔开的字符串数并不固定,也就是说它也可能是"xx|bby|ssd|pa|ddd|gg",但至少要分隔的字符串数有两个,要求处理完后可以把由"|"分隔开的字符串分别返回出来,需要输出几个字符串就赋给几个变量!求高手大哥帮忙啊!

解决方案 »

  1.   

    ---写个自定义拆分函数,返回数据集/*
    功能:实现split功能的函数
    */CREATE function fn_split 
    (
    @inputstr varchar(8000), 
    @seprator varchar(10)
    )
    returns @temp table (a varchar(200))
    as begin
    declare @i int set @inputstr = rtrim(ltrim(@inputstr))
    set @i = charindex(@seprator, @inputstr) while @i >= 1
    begin
    insert @temp values(left(@inputstr, @i - 1)) set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
    set @i = charindex(@seprator, @inputstr)
    end if @inputstr <> '\'
    insert @temp values(@inputstr) return 
    end
    go
      

  2.   

    --调用select * from dbo.fn_split('aa1|bb1|pst|ee|fsd','|')
      

  3.   

    啊,真是不错啊,大哥,原来有实现split功能的函数啊!
      

  4.   

    用存储过程也可处理
    但处理方法与wangtiecheng类似
      

  5.   

    ---用存储过程这样???
    ---创建存储过程
    Create Proc Sp_TestSplit
        @IDS Varchar(1000),
        @FGF Varchar(10)
    As
        Declare @T Table([Test] Varchar(10)) 
        Begin
            While CharIndex(Cast(@FGF As Varchar),@IDS)>0 
               Begin
                 Insert @T Select Left(@IDS,CharIndex(Cast(@FGF As Varchar),@IDS)-1)           
                 Set @IDS=Stuff(@IDS,1,CharIndex(Cast(@FGF As Varchar),@IDS),'')
               End
            Insert @T Select @IDS 
        End
        Select * From @T
    GO
    ----调用存储过程
    EXEC Sp_TestSplit 'aa1|bb1|pst|ee|fsd','|'
    ---EXEC Sp_TestSplit 'aa1,bb1,pst,ee,fsd',','
      

  6.   

    declare @a varchar(100),@b char(1)set @a='aa1|bb1|pst|ee|fsd'
    set @b='|'select top  100 id=identity(int,1,1) into # from syscolumns
    select 
    substring(@a+@b,id,charindex(@b,@a+@b,id+1)-id) Value
    from #
    where substring(@b+@a,id,1)=@b
    drop table #
      

  7.   

    这个我也不是很会
    这里有几个 老乌龟 的例子 你看看能对你有点帮助
    如何将'2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1'按'|'分割成
    2006-01-12
    2006-02-13
    2006-03-15
    2006-11-11
    2003-1-1
    declare @Days varchar(4000)
    declare @tmpDay varchar(10)
    set @Days='2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1'
    set @tmpDay=''
    declare @i int
    set @i=0
    while @i<len(@Days)
    begin 
      set @i=@i+1
      if SUBSTRING(@Days,@i,1)='|'
         begin
           print left(@Days,@i-1)
           set @Days=SUBSTRING(@Days,@i+1,len(@Days))
           set @i=0
         end  
    end
    print @Days
    输出结果:
    2006-01-12
    2006-02-13
    2006-03-15
    2006-11-11
    2003-1-1一字段信息包括如下:李三|李三@d.com|公司|单位地址|  
    我将查询用(Select)只列出李三及单位地址的方法?create table #t(c1 varchar(100))
    insert into #t select 'li4|33@com|mircrosoft|china|'
    insert into #t select 'zhang3|[email protected]|IBM|USA|'
    insert into #t select '李三|李三@d.com|公司|单位地址|'
    select substring(c1,1,charindex('|',c1)-1) as name, 
    reverse(substring(reverse(c1) , 2 , charindex('|' , reverse(c1) , 2) - 2)) as address  from #tdrop table #tname    address   
    -----   -------
    li4     china
    zhang3  USA
    李三    单位地址(所影响的行数为 3 行)
    declare @s varchar(20)
    set @s='06G512753-08-01'  
    select 
        parsename(t.s,3) part1,
        parsename(t.s,2) part2,
        parsename(t.s,1) part3
    from 
        (select replace(@s,'-','.') as s) t