可是在程序中调用,报错,错误为“超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。”CREATE procedure ProductRandomSKU
as
 declare @randCardID varchar(20)
 declare @r numeric(15,8) 
 declare @tempStr  char(10)
 select @r=rand((datePart(mm, getDate()) * 100000 )+ (datePart(ss, getDate()) * 1000 ) + datePart(ms, getDate()))
 set @tempStr=convert(char(10),@r)
 set @randCardID=substring(@tempStr,4,7)
 if not exists(select 1 from CollectProduct where sku=@randCardID)
 begin
  select @randCardID
  return;
 end
 else
 begin
  exec ProductRandomSKU
 endGO

解决方案 »

  1.   

    begin
      exec ProductRandomSKU
     end是不是老是执行这了,死循环了
      

  2.   

    你要个什么随机数?--8位随机数的生成
    select id = right('00000000' + cast(cast(rand(checksum(newid()))*10000000 as int) as varchar),8) from sysobjects--四位随机整数的生成
    select id = cast(RAND() * 10000 as int)--随机生成一个70到99的数
    cast(RAND() * 100 as int) % 30 + 70--8000到20000随机的数
    select ceiling (rand()*(20000-8000)+8000)
      

  3.   

    --随机生成一个字母
    --小写
    select char(rand()*26+97)--大写
    select char(rand()*26+65)
      

  4.   

    declare   @maxNumber   int,   --随机数最大值 
       @minNumber   int,   --随机数最小值 
                      @rows   int               --要取得的行数   
    select   @maxNumber=10000, @minNumber=10000, 
                    @rows=10   
        
    set   rowcount   @rows   
        
    select   distinct   '1234 4567 '+convert(varchar,ID)+' '+convert(varchar,ID)+' '+convert(varchar,ID)+' '+convert(varchar,ID)   as   'B'   
    from   (    
                    select   convert(int,rand(checksum(newid()))*@minNumber)   as   ID   
                    from   syscolumns,sysobjects   
                )t   
        
    set   rowcount   0 
    -----------------------------------------------------------------------
    declare     @num1     int ,@num2     int ,@num3     int ,@num4     int   
    set @num1=rand(abs(convert(int,checksum(newid()))))*10000
    set @num2=rand(abs(convert(int,checksum(newid()))))*10000
    set @num3=rand(abs(convert(int,checksum(newid()))))*10000
    set @num4=rand(abs(convert(int,checksum(newid()))))*10000   
    select   convert(varchar(100),@num1)+' '+convert(varchar(100),@num2)+' '+convert(varchar(100),@num3)+' '+convert(varchar(100),@num4)
    ---------------------------------------------------------------------------
    declare @r1 numeric (15,0),@r2 numeric (15,0)
    SELECT @r1=RAND( (DATEPART(mm, GETDATE()) * 100000 )
               + (DATEPART(ss, GETDATE()) * 1000 )
               + DATEPART(ms, GETDATE()) )*10000
    print @r1
      

  5.   

    sql server的嵌套有限制,改用循环作罢
      

  6.   

      在T-SQL中调用不会的,可程序就不行,那位大哥帮下
      

  7.   

    CREATE procedure ProductRandomSKU
    as
     declare @randCardID varchar(20)
     declare @r numeric(15,8)  
     declare @tempStr char(10)
     select @r=rand((datePart(mm, getDate()) * 100000 )+ (datePart(ss, getDate()) * 1000 ) + datePart(ms, getDate()))
     set @tempStr=convert(char(10),@r)
     set @randCardID=substring(@tempStr,4,7)
     while not exists(select 1 from CollectProduct where sku=@randCardID)
     begin
      select @randCardID
      return;
     end
     else
     begin
      select @r=rand((datePart(mm, getDate()) * 100000 )+ (datePart(ss, getDate()) * 1000 ) + datePart(ms, getDate()))
      set @tempStr=convert(char(10),@r)
      set @randCardID=substring(@tempStr,4,7)
     endGO
      

  8.   

    用 abs(checksum(newid())) 处理