http://topic.csdn.net/u/20091102/02/47af08d2-5bb8-4ce6-ad1c-4c18a4d7e926.html
原贴,但仍未有解决
是这样,我需要一个函数,用于解决sql字符串传参时的拆分,我现在用的是set @k = charindex(',',@keye)    while @k>=1 
这种方法,但我认为我原有方法过于复杂重用性不高即每次需要重写一些细节代码,所以想求一个重用并重高效的函数,来处理这种情况, 函数sql_str  (tabale 名称,tbale 字段 ,数据 ,拆分分割字符[]) 。拆分分割字符 最少为2个应为最少我也需要处理二次分解情况。
 
举例:
set  tbaledata='sdf,df^2,5^3,8^4,9^d,bbb' 
即对上面的字符拆分,最终结果是将 数据
 col1                                  col2
------------                     ------------------
sdf                                    df
2                                       5
3                                      8
4                                      9
d                                      bbb但注意tbale 字段是需要传参col1,col2,col3......即这可变的,原贴中只解决了固定col的情况,对于变动col没有较好的解决 。

解决方案 »

  1.   

    参考
    if object_id('tb') is not null
      drop table tb
    go
    create table tb( id varchar(100))go
    declare @s varchar(8000)
    set @s='sdf,df^2,5^3,8^4,9^d,bbb'
    insert tb
    select
     
        id=substring(@s, number, charindex('^', @s + '^', number) - number)
    from master..spt_values
    where type='p' 
        and substring(',' + @s,number,1) = '^'  
    select    col1= substring(id,1,charindex(',',id)-1),col2=stuff(id,1,charindex(',',id),'') from tb/*
    col1                                                                                                 col2
    ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    2                                                                                                    5
    3                                                                                                    8
    4                                                                                                    9
    d                                                                                                    bbb(4 行受影响)
    */
      

  2.   

    declare @s varchar(200)
    declare @split varchar(2)
    select @s='sdf,df^2,5^3,8^4,9^d,bbb',@split='^'
    select left(substring(@s,number,charindex(@split,@s+@split,number)-number),
           charindex(',',substring(@s,number,charindex(@split,@s+@split,number)-number))-1),
           right(substring(@s,number,charindex(@split,@s+@split,number)-number),
           len(substring(@s,number,charindex(@split,@s+@split,number)-number))-charindex(',',substring(@s,number,charindex(@split,@s+@split,number)-number)))
    from master..spt_values
    where type='p' and number<=len(@s+'a') 
    and charindex(@split,@split+@s,number)=number
    /*
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    sdf                                                                                                                                                                                                      df
    2                                                                                                                                                                                                        5
    3                                                                                                                                                                                                        8
    4                                                                                                                                                                                                        9
    d                                                                                                                                                                                                        bbb(5 個資料列受到影響)*/
      

  3.   


    declare @s as varchar(200)
    set @s='sdf,df^2,5^3,8^4,9^d,bbb';
    select 'select '''+replace(replace(@s,',',''','''),'^',''' union all select ''')+''''
      

  4.   


    --创建分割字符串存储过程DivideString
    CREATE PROCEDURE DivideString
    (
    @String NVARCHAR(1210),  -- 要分隔的字符串
    @SPLITCHAR NVARCHAR(10) = ',', -- 默认分隔字符
    @TableName NVARCHAR(30) = 'table'  --默认表名
    )
    AS
    DECLARE @L INT -- 第一个分隔字符的位置
    DECLARE @S INT -- 第二个分隔字符的位置
    SET @L = 0 
    SET @S = CHARINDEX(@SPLITCHAR, @String, @L)WHILE @L <= LEN(@String)
    BEGIN
     DECLARE @ColName NVARCHAR(50) 
     IF @S = 0 SET @S = LEN(@String) + 1 -- 如果到最后一个字符串那么第二个分隔字符的位置就是这个字符串的长度加一
     SET @ColName = SUBSTRING(@String, @L, @S - @L) -- 取值
     SET @L = @S + 1
     SET @S = CHARINDEX(@SPLITCHAR, @String, @L)
     IF LTRIM(RTRIM(@ColName)) = '' CONTINUE -- 如果是空字符串就跳过
     DECLARE @SQL NVARCHAR(1000)
     SET @SQL ='INSERT INTO ' + @TableName + '(tcname) select ''' +@ColName+'''' --插入表的语句,根据自己需求修改
     EXEC (@SQL)
     --Print @sql
    END
    --使用
    EXEC DivideString 'sdf,df^2,5^3,8^4,9^d,bbb',',','表名'
      

  5.   

    还是不行,比如你数据变为  
    @s='sdf,df,a^2,5,a^3,8,a^4,9,a^d,bbb,a'
      

  6.   

    declare @s as varchar(200)
    set @s='sdf,df,a^2,5,a^3,8,a^4,9,a^d,bbb,a';
    set @s='select '''+replace(replace(@s,',',''','''),'^',''' union all select ''')+''''
    exec(@s)
    /*
    ---- ---- ----
    sdf  df   a
    2    5    a
    3    8    a
    4    9    a
    d    bbb  a(5 個資料列受到影響)*/
      

  7.   

    看来的确还是只能用sql拼接的方式了。