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

哪位大哥帮忙看下小弟我这个存储过程哪有有关问题

2012-01-28 
哪位大哥帮忙看下我这个存储过程哪有问题我想写一个存储过程随机生成6位的字符串,用来做登陆名。alterprocS

哪位大哥帮忙看下我这个存储过程哪有问题
我想写一个存储过程随机生成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都用反了.

热点排行