首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

好像是有些情况会死循环,帮忙看看,该怎么处理

2012-01-31 
好像是有些情况会死循环,帮忙看看setANSI_NULLSONsetQUOTED_IDENTIFIERONgoALTERfunction[dbo].[GetArticl

好像是有些情况会死循环,帮忙看看
set   ANSI_NULLS   ON
set   QUOTED_IDENTIFIER   ON
go

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   <>   ' ')
        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




[解决办法]
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的时候会死循环
因为
IF(@IntI < 2)
的else没有处理
不会改变@Classid的值
而循环条件只有唯一的@Classid <> ' '

热点排行