update aabb_f set BloodGroup=ceiling(rand()*4) where IsTrue=0我想让BloodGroup列的数据随机成1~4,可是这样写BloodGroup列的数据都一样(就随机了一次),没有起到随机的作用,怎么改啊??

解决方案 »

  1.   

    update aabb_f set BloodGroup=1+abs(checksum(newid()))%4 where IsTrue=0
      

  2.   


    T-SQL中的随机数 1、0-9间的随机整数,包括0和9本身: abs(checksum(newid()))%10 扩展从a-b间的随机整数(a,b本身也是整数): a+abs(checksum(newid()))%(b-a+1) 2、0-1间的随机实数: rand() --或是 rand(checksum(newid())) 由此扩展从a-b间的随机实数: a+rand(checksum(newid()))*(b-a) 注意上面的取法使得取值范围(a,b],若是想要取得(a,b),可以采用下面的表达式 a+rand(checksum(newid()))*(b-a)*0.99999 -- 此处0.99999可以更换为0.999999999,精度根据需要来取
      

  3.   

    你用的是更新,一次行把列BLOODGROOP全改成一次随机的值 当然起不了随机的作用!
      

  4.   

    update tb set 单位名称=ltrim(1+abs(checksum(newid()))%4)
    select * from tb
    --------------------
    单位名称 日期
    2 2010-01-01 00:00:00.000
    1 2010-01-01 00:00:00.000
    1 2010-01-02 00:00:00.000
    1 2010-01-03 00:00:00.000
    4 2008-04-05 00:00:00.000
    2 2006-02-02 00:00:00.000
    2 2006-02-02 00:00:00.000测试结果
      

  5.   


    --> 数据库版本:
    --> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
    --> 测试数据:aabb_f
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'aabb_f') 
    AND type in (N'U')) 
    DROP TABLE aabb_f
    GO---->建表
    create table aabb_f([BloodGroup] varchar(20),[IsTrue] int)
    go
    insert aabb_f
    select '1231',0 union all
    select 'adsd',0 union all
    select '3121',0
    GOupdate aabb_f 
    set BloodGroup=abs(checksum([BloodGroup])%4)
    where IsTrue=0--> 查询结果
    SELECT * FROM aabb_f
    --> 删除表格
    --DROP TABLE aabb_f
      

  6.   

    用了 Dlut_LIuQ 方法可以了。帮忙解释一下 我这样写为什么不可以
      

  7.   

    #1. 生成新的guid
    #2. 用checksum转换成int
    #3. 取绝对值
    #4. 用4取余,结果可能为0-3
    #5. 加1,结果可能为1-4,OK
      

  8.   

    你的不可以的原因:
    请理解UPDATE语句的原理
      

  9.   

    原因主要是在newid()和rank(),楼主可以试下SELECT RANK(4),会一直返回相同的值
      

  10.   


    select rand(4) 确实每次结果都一样

    select rand() 每次结果也不一样啊
      

  11.   

    SELECT TOP(10) GETDATE(), RAND(), NEWID()
    FROM sys.columns
    两个函数的执行机制不一样。几乎所有函数都是在执行一个查询时只计算一次。只有NEWID()会针对查询的每一行结果进行计算。
      

  12.   

    rank()函数是每次查询调用一次,并不是每行计算一次,而newid()回为每行计算一次。