警告
ビューに関するAdamの回答は非常に非効率的であり、非常に大きなセットの場合、データベースをかなりの時間使用する可能性があります。定期的に、または本番環境で大きなテーブルにデータを入力する必要がある状況では、使用しないことを強くお勧めします.
代わりに、この回答を使用できます。
証拠:
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)
プロファイラー トレース:
代替テキスト http://img519.imageshack.us/img519/8425/destroydbxu9.png
これは、0 から 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