set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER     function [dbo].[GetArticleSearchClassName](@Classid nvarchar(50))
returns varchar(100)
as
begin
declare @vStrLen int
declare @vID varchar(10)
declare @s nvarchar(100)
declare @className nvarchar(50)
declare @IntI int
--set @Operator=''
set @s=''
if (@Classid = '' or @Classid is null)
begin
return(@s)
end
else
begin
    set @IntI = 0
    while(@Classid <> '')
    begin
    IF(@IntI < 2)
    BEGIN
        SET @IntI = @IntI + 1
        set @className=''
        set @vStrLen=0
        select @vStrLen=CHARINDEX( '|',@Classid)--去取字符的长度        if(@vStrLen<>0)--检索到了符号"/"
        begin
             select @vID=SUBSTRING(@Classid,1,@vStrLen-1) --取单个的ID
             select @Classid=STUFF(@Classid,1,@vStrLen,'')--去掉前面的ID
        end
        else--检索没有符号"/"
        begin
            select @vID=@Classid --取单个的ID
            select @Classid=STUFF(@Classid,1,len(@Classid),'')--去掉前面的ID
        end
        select @className=classname from Class where ID=@vID
        if(@s<>'')
        begin
            set @s=@s+' => '
        end
        set @s=@s+@className
END
end
return(@s)
end
return(@s)
end

解决方案 »

  1.   

    Try:ALTER     function [dbo].[GetArticleSearchClassName](@Classid nvarchar(50))
    returns varchar(100)
    as
    begin
    declare @vStrLen int
    declare @vID varchar(10)
    declare @s nvarchar(100)
    declare @className nvarchar(50)
    declare @IntI int
    --set @Operator=''
    set @s=''
    if (@Classid = '' or @Classid is null)
    begin
    return(@s)
    end
    else
    begin
        set @IntI = 0
        while(@Classid <> '' and @IntI < 2)
        begin
            SET @IntI = @IntI + 1
            set @className=''
            set @vStrLen=0
            select @vStrLen=CHARINDEX( '|',@Classid)--去取字符的长度        if(@vStrLen<>0)--检索到了符号"/"
            begin
                 select @vID=SUBSTRING(@Classid,1,@vStrLen-1) --取单个的ID
                 select @Classid=STUFF(@Classid,1,@vStrLen,'')--去掉前面的ID
            end
            else--检索没有符号"/"
            begin
                select @vID=@Classid --取单个的ID
                select @Classid=STUFF(@Classid,1,len(@Classid),'')--去掉前面的ID
            end
            select @className=classname from Class where ID=@vID
            if(@s<>'')
            begin
                set @s=@s+' => '
            end
            set @s=@s+@className
        end
    end
    return(@s)end
    go
      

  2.   

    当层次>2的时候会死循环
    因为
    IF(@IntI < 2)
    的else没有处理
    不会改变@Classid的值
    而循环条件只有唯一的@Classid<>''