SQL2005中的问题求解:我外部有一个类型为nchar(2)的字符串会不规律存取到某个列值当中,并且字符串中间以逗号进行区分。
比如象这样:“A1,A2,A3,A4..An”。
我事后需要把这组字符串按逗号截取出来,并分别存储到不同的变量中。比如:@a=A1;@b=A2,@c=An..
注:这个列表中的字符串的长度是不规则的。请帮小弟写一个按规律循环截取字符串并作变量赋值的示例。非常感谢!

解决方案 »

  1.   

    Create function [dbo].[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 
    endDECLARE  @str VARCHAR(100)
    set @str='asf,asdf,fdsaf,asdfa,sdf,asd'
    SELECT a FROM [dbo].[fn_split](@str,',')a
    -------------------
    asf
    asdf
    fdsaf
    asdfa
    sdf
    asd(6 row(s) affected)
      

  2.   

    /*
    功能:实现split功能的函数
    */create function dbo.fn_split 
    (
    @inputstr varchar(8000), 
    @seprator varchar(10)
    )
    returns @temp table (a varchar(200))
    as begin
    declare @i intset @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)
    endif @inputstr <> '\'
    insert @temp values(@inputstr)return 
    end
    go--调用declare @s varchar(1000)set @s='1,2,3,4,5,6,7,8,55'select * from dbo.fn_split(@s,',')drop function dbo.fn_split /*
    a                     
    ----------------------
    1
    2
    3
    4
    5
    6
    7
    8
    55(所影响的行数为 9 行)
    */
      

  3.   

    因为SQL没有数组,L上都用函数实现分割字符串。返回一个表。
    所以在引用时,须用游标 给变量赋值。declare @s='A1,A2,A3,A5'
    declare @a nvarchar(2)declare @cur cursor for select * from dbo.fn_split(@s,',')--defineopen @cur fetch next  from @cur into @a while @cursor_status=0 --开始循环
    begin--就里就可以做你的处理
    fetch next  from @cur into @a 
    end
    CLOSE @cur --关闭游标
    DEALLOCATE @cur--释放游标