一个select查询,如何取到不同的随机数。
select rand(),* from tb
得到的值是同一个。
MSSQL中有没有方便的方法?

解决方案 »

  1.   

    select newid(),* from tb
      

  2.   

    要得到随机数,不是随机排序,不能转换为int的。
      

  3.   

    --------------开始查询--------------------------
    select RAND(CHECKSUM(NEWID())) from tb 
    ----------------结果----------------------------
    /* ----------------------
    0.723152361031656
    0.160484717876467
    0.771261595722306
    0.375298450220022
    0.0203323160252095
    0.795553182980927
    0.0101359270481781
    0.497010851787122(8 行受影响)*/
      

  4.   


    select ABS(CHECKSUM(NEWID()))----------- 
    615848090(所影响的行数为 1 行)
      

  5.   

    还可以利用时间那个呀,REPLACE()替换那些'-',':'
      

  6.   

    --------------开始查询--------------------------
    select abs(CHECKSUM(NEWID())) from tb 
    ----------------结果----------------------------
    /* 
    -----------
    2063005324
    385171136
    216937953
    1074920898
    1650344707
    2097133148
    1216021305
    1652729165(8 行受影响)*/
      

  7.   

    --try
    select *,CHECKSUM(RAND()) from tb
      

  8.   

    那生成100内的随机数,与表的某列相乘,得到一个查询怎么弄?
    还是要用rand吧。
      

  9.   

    SELECT CAST(NEWID() AS VARBINARY)*1
      

  10.   

    select RAND(CHECKSUM(NEWID())) from tb --0-1
    select (RAND(CHECKSUM(NEWID())))*66 from tb --0-66
    select (RAND(CHECKSUM(NEWID())))*100 from tb --0-100
      

  11.   

    1、select  rand(checksum(newid()))*@number
    2、select cast(round(rand(checksum(newid()))*@number,0) as varchar)
    好象有点长,有没简单些的方法?
      

  12.   

    DECLARE @BNUM INT,@ENUM INT
    SELECT @BNUM=3,@ENUM=5
    SELECT ABS(CHECKSUM(NEWID()))%(@ENUM-@BNUM+1)+@BNUM
      

  13.   


    生成1-8范围内的随机数: 
    select  (rand()*8+1) 
      

  14.   

    8.74110826715274
    因为rand返回的是float,所以计算值不是整数了。当然还要是可以在查询中用的,不同行的值不一样的了。呵呵努力下,看有没效率高些的方法。
      

  15.   

    1000以内的select rid=abs(checksum(newid()))%1000 from sysobjects
      

  16.   

    NEWID 对每台计算机返回的值各不相同。所显示的数字仅起解释说明的作用。     随机函数:rand()   在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法:      1、   A:select floor(rand()*N) ---生成的数是这样的:12.0   B:select cast( floor(rand()*N) as int) ---生成的数是这样的:12      2、   A:select ceiling(rand() * N) ---生成的数是这样的:12.0   B:select cast(ceiling(rand() * N) as int) ---生成的数是这样的:12      其中里面的N是一个你指定的整数,如100,可以看出,两种方法的A方法是带有.0这个的小数的,而B方法就是真正的整数了。
      

  17.   

    SELECT CEILING(RAND()*100/10)
    这是1到10的随机整数
      

  18.   

     1-1000
    select  cast((rand()*999+1) as int)
    /*-----------
    842(1 行受影响)
    */
      

  19.   

     我来个笨方法select number from master..spt_values
    where type='p' and number between 0 and 100
    order by newid() 
    number
    -----------
    67
    33
    28
    21
    55
    8
    50
    69
    72
    68
    23
    43
    61
    35
    60
    90
    31
    19
    54
    62
    83
    47
    16
    92
    75
    73
    80
    42
    18
    34
    22
    5
    41
    89
    96
    26
    58
    70
    32
    66
    24
    86
    0
    81
    78
    51
    46
    49
    27
    38
    36
    84
    40
    91
    25
    44
    17
    56
    29
    95
    9
    37
    13
    77
    2
    48
    39
    14
    88
    45
    64
    30
    85
    4
    1
    59
    6
    97
    52
    15
    11
    76
    98
    3
    53
    74
    94
    82
    71
    100
    10
    20
    7
    65
    99
    57
    79
    93
    12
    63
    87(101 行受影响)
      

  20.   

    随机为每一行加个行号?select 
      sno=(select count(1)+1 from (select *,newid() as tid from tb) t2 where tid<t1.tid),
      col1,col2,...,coln
    from  
      (select *,newid() as tid from tb) t1
    order by sno这效率貌似不高
      

  21.   

    也可以用临时表select *,sno=identity(int,1,1) into # from tb order by newid()select * from # order by snodrop table #
      

  22.   

    再提供
    create view v_RAND
    as
    select re=stuff(rand(),1,2,'')
    goalter function f_RANDBH()
    returns varchar(50)
    as
    begin
    declare @bhlen int
    set @bhlen=18  --长度
     declare @r varchar(50)
     if not(isnull(@BHLen,0) between 1 and 50)
      set @BHLen=10
    lb_bh:
     select @r=re from v_RAND
     while len(@r)<@BHLen
      select @r=@r+re from v_RAND
     set @r=left(@r,@BHLen) 
     if exists(select * from tb with(xlock,paglock) where bh=@r)
      goto lb_bh return(@r)
    end
    go
    select dbo.f_RANDBH(50)  --位数自定,最长50  --28717932268756598246257824810881924833466287969484if OBJECT_ID('tb') is not null drop table tb
    CREATE TABLE tb(
    BH varchar(50) PRIMARY KEY DEFAULT dbo.f_RANDBH(),
    col int)insert tb(col) select '1'
    union all select '2'
    union all select '3'
    union all select '4'select * from tb/*
    BH col
    05687060012621147682667991318240430642346925752116 2
    40513682887835085371622114346506827930698368827862 4
    93225207611122374334349586587204091830009171524409 3
    99914455216184595182213501939577680323090326328828 1
    */