if exists(select * from sysobjects where type='FN' and name='getSplitNum')
drop function getSplitNum
go
create function getSplitNum(@content text,@split varchar(10))
returns int
as
begin
    declare @index int;set @index=1;
    declare @num int;set @num=0;
    declare @start int;set @start=0;
    while @index>0
    begin        
        set @index=charindex(@split,@content,@start);
        set @start=@index+1;
        set @num=@num+1;
    end
    return @num;
end
godbo.getSplitNum(@c_url,'|||')存储过程里,如上代码,计算某字符串里,有多少个由|||分开的字符串. 运行结果最大值只有87,请教老师,问题在哪?---------------------------------------
问题基本查到.但不知道怎么解决.由于@c_url过长(长度达到13000字符以上),导致出现比实际值小很多.请教各位老师

解决方案 »

  1.   

    你的字符串中是不是有中文字符?或者其他由非英文+数字组成的字符串?
    把@content 定义为ntext看看。
      

  2.   

    主要是text 搞的鬼 你可以改成 varchar(max)
      

  3.   

    sql 2000 无法用 max吧?
      

  4.   

    if exists(select * from sysobjects where type='FN' and name='getSplitNum')
    drop function getSplitNum
    gocreate function getSplitNum(@content text,@split varchar(10))
    returns int
    as
    begin
        declare @index int;set @index=1;
        declare @num int;set @num=0;
        declare @start int;set @start=0;
       -- set @content=cast(@content as varchar(max))
        while @index>0
        begin   
        --原因     
        
            set @index=charindex(@split,cast(@content as varchar(max)),@start);
            set @start=@index+1;
            set @num=@num+1;
        end
        return @num;
    end
    go
    改成这样就对了,但是效率很低。
      

  5.   

    可以用下面的方法
    if exists(select * from sysobjects where type='FN' and name='getSplitNum')
    drop function getSplitNum
    gocreate function getSplitNum(@content varchar(max),@split varchar(10))
    returns int
    as
    begin
        declare @index int;set @index=1;
        declare @num int;set @num=0;
        declare @start int;set @start=0;
        set @num=(len(@content)-len(replace(@content,@split,'')))
        set @num=@num/len(@split)
        --while @index>0
        --begin   
        ----原因     
        
        --    set @index=charindex(@split,cast(@content as varchar(max)),@start);
        --    set @start=@index+1;
        --    set @num=@num+1;
        --end
        return @num;
    end
    go
    declare @t table(name varchar(max)) 
    insert into  @t select replicate(cast(newid() as varchar(max))+'|||',10000)
    select dbo.getSplitNum(name,'|||')  from @t
    /*
    -----------
    10000      
    (1 行受影响)
    */
      

  6.   

    sql 2000 里 可以用 varchar(max)  吗?
      

  7.   

    感觉问题出在  charindex  里,而不是text问题.
      

  8.   

    一样,charindex  在查找的时候把你的字段强制转换为了 varchar(8000)