日期:2014-05-18  浏览次数:20475 次

哪位大哥帮忙看下我这个存储过程哪有问题
我想写一个存储过程随机生成6位的字符串,用来做登陆名。
alter   proc   Send_comp
@comid   varchar(6)   output
as  
declare   @newid   varchar(36)
WHILE     (0=0)    
    BEGIN      
          set   @newid=newid()
set   @comid=substring(@newid,1,6)
                                    --看comp表中是否已经存在该登陆名,如果存在,继续循环;不存在。则跳出循环,最后返回这个随机字符串
                          IF(select   count(*)   from   comp   where   comid=@comid)> 0      
                        BREAK      
            ELSE      
                      CONTINUE      
  END      
return   @comid
go

可执行这个存储过程起来动都不动,难道里面有死循环?

------解决方案--------------------
把CONTINUE和BREAK调换一下位置,否则可能导致死循环.
------解决方案--------------------
IF(select count(*) from comp where comid=@comid)> 0
BREAK
ELSE
CONTINUE

这个判断错了,改为:
IF(select count(*) from comp where comid=@comid)=0
BREAK
或者
IF not exists(select * from comp where comid=@comid)
BREAK

我推荐
IF not exists(select * from comp where comid=@comid)
BREAK


另外:不需要return 语句
------解决方案--------------------
alter proc Send_comp
@comid varchar(6) output
as
declare @newid varchar(36)
WHILE (0=0)
BEGIN
set @newid=newid()
set @comid=substring(@newid,1,6)
--看comp表中是否已经存在该登陆名,如果存在,继续循环;不存在。则跳出循环,最后返回这个随机字符串
IF exists(select 1 from comp where comid=@comid)
CONTINUE
ELSE
BREAK
END
--return @comid /*必须删除此行,因为return只能返回整数*/
go
------解决方案--------------------
打你PP,break和continue都用反了.