DBMNG数据库管理与应用

独立思考能力,对于从事科学研究或其他任何工作,都是十分必要的。
当前位置:首页 > SQLServer > 应用案例

SQLSever:如何在select中的每一行产生不同的随机数?

select 的随机函数有点假, 也许是因为它是基于时间来的吧, 同一select中由于时间无法错开导致产生的随机数都是一样的, 如何做到让不同的行拥有不同的随机数呢?

下面以产生某个月的随机日期来示例吧。


[sql] 
  1. --创建最小为1 最大为31 的视图  
  2. if object_id('view_rand_int31') is not null  
  3. begin  
  4.     drop view view_rand_int31  
  5. end  
  6. go  
  7. create view view_rand_int31  
  8. as   
  9.     select cast(ceiling(rand() * 31) as int) as [r]  
  10. go  
  11. --创建日期(天)的随机函数  
  12. if object_id('dbo.Fun_GetRandDay') is not null  
  13. begin  
  14.     drop function dbo.Fun_GetRandDay  
  15. end  
  16. go  
  17. CREATE FUNCTION dbo.Fun_GetRandDay  
  18. (  
  19. @max INT  
  20. )  
  21. returns int  
  22. as   
  23. begin  
  24.     declare @r int  
  25.     select @r = [r] from view_rand_int31  
  26.       
  27.     while @r>@max  
  28.     begin  
  29.         select @r = [r] from view_rand_int31  
  30.         if @r<=@max  
  31.         begin  
  32.             break;  
  33.         end  
  34.     end  
  35.     return @r  
  36. end  
  37. go  
  38. --试验select条件下实现多条记录同时取随机数  
  39. --插入试验数据行  
  40. declare @t table(rowNum int identity, [yearMonth] nvarchar(20))  
  41. declare @i int,@imax int  
  42. select @i=1,@imax =28  
  43. while @i<=@imax  
  44. begin  
  45.     insert into @t ([yearMonth]) select '2014年2月'  
  46.     set @i=@i+1  
  47. end  
  48. --执行查询  
  49. select *,    
  50.     cast( '2014-02-' + cast( dbo.Fun_GetRandDay(28) as varchar(2)) as datetime) as [date],   
  51.     (select cast(ceiling(rand() * 28) as int)) as [r]    
  52. from @t  

本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号