How do I return random numbers as a column in SQL Server 2005?

后端 未结 12 808
误落风尘
误落风尘 2020-12-03 01:34

I\'m running a SQL query on SQL Server 2005, and in addition to 2 columns being queried from the database, I\'d also like to return 1 column of random numbers along with the

12条回答
  •  北荒
    北荒 (楼主)
    2020-12-03 02:15

    WARNING

    Adam's answer involving the view is very inefficient and for very large sets can take out your database for quite a while, I would strongly recommend against using it on a regular basis or in situations where you need to populate large tables in production.

    Instead you could use this answer.

    Proof:

    CREATE VIEW vRandNumber
    AS
    SELECT RAND() as RandNumber
    
    go 
    
    CREATE FUNCTION RandNumber()
    RETURNS float
    AS
      BEGIN
      RETURN (SELECT RandNumber FROM vRandNumber)
      END
    
    go 
    
    create table bigtable(i int)
    
    go 
    
    insert into bigtable 
    select top 100000 1 from sysobjects  a
    join sysobjects b on 1=1
    
    go 
    
    select cast(dbo.RandNumber() * 10000 as integer) as r into #t from bigtable 
    -- CPU (1607) READS (204639) DURATION (1551)
    
    go
    
    select ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 10000 as r  into #t1 
    from bigtable
    -- Runs 15 times faster - CPU (78) READS (809) DURATION (99)
    

    Profiler trace:

    alt text http://img519.imageshack.us/img519/8425/destroydbxu9.png

    This is proof that stuff is random enough for numbers between 0 to 9999

    -- proof that stuff is random enough 
    select avg(r) from #t
    -- 5004
    select STDEV(r) from #t
    -- 2895.1999 
    
    select avg(r) from #t1
    -- 4992
    select STDEV(r) from #t1
    -- 2881.44 
    
    
    select r,count(r) from #t
    group by r 
    -- 10000 rows returned 
    
    select r,count(r) from #t1
    group by r 
    -- 10000 row returned 
    

提交回复
热议问题