DROP FUNCTION  dbo.f_splitSTR
CREATE FUNCTION   f_splitSTR(
@s   varchar(8000),   --待分拆的字符串
@split varchar(10)     --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END--这句的含义 SET @splitlen=LEN(@split+'a')-2sql老大的--3.2.1 循环截取法

解决方案 »

  1.   

    等于是减1 因为可能@split为空 len错误
      

  2.   

    SET @splitlen=LEN(@split+'a')-2 
    这句是为了读@split后面带空格的,因为LEN会自动忽略右边的空格
      

  3.   

     SET @splitlen=LEN(@split+'a')-2 
    设置@splitlen这个变量的长度=它本身再加一个a字母的长度减2
      

  4.   

    SELECT LEN('A       ')-1
    --0
    SELECT LEN('A       '+'A')-2
    --7
      

  5.   

    sorry,回快了,是三楼的意思。
      

  6.   

    up.
    len函数会忽略后面的空格
      

  7.   

    @split+'a'-2可以避免空格带来的错误 
    与charindex(','+'a'+',',','+col+',')这样的处理逗号的方法有某些相似之处
      

  8.   

    。。TONY哥那个是误区么?》。
      

  9.   

    @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')--这里有引用了@splitlen
      

  10.   

    alter FUNCTION   f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
    IF RIGHT(@s,1)<>@split
    SET @s=@s+@split
        WHILE CHARINDEX(@split,@s)>0
        BEGIN
            INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
            SET @s=STUFF(@s,1,CHARINDEX(@split,@s),'')
        END
        INSERT @re VALUES(@s)
        RETURN
    END
    GODECLARE @s VARCHAR(200)
    SET @s='ab,cd,ee,ff,g'SELECT * FROM dbo.f_splitSTR(@s,',')
    /*
    col
    ----------------------------------------------------------------------------------------------------
    ab
    cd
    ee
    ff
    g
    (6 行受影响)
    */SET @s='ab,cd,ee,ff,g  'SELECT * FROM dbo.f_splitSTR(@s,',')
    /*
    col
    ----------------------------------------------------------------------------------------------------
    ab
    cd
    ee
    ff
    g  
    (6 行受影响)*/SET @s='ab,cd,ee,ff,g ,'
    /*
    col
    ----------------------------------------------------------------------------------------------------
    ab
    cd
    ee
    ff
    g  
    (6 行受影响)
    */可以改为这样。