表中的每一行都需要一个不同的随机数。下面的代码对每一行使用相同的随机值。

SELECT table_name, RAND() magic_number 
FROM information_schema.tables 

我想从中得到一个INT或FLOAT。接下来,我将使用这个随机数从已知日期创建一个随机日期偏移量,例如从开始日期的1-14天偏移量。

这是为Microsoft SQL Server 2000。


当前回答

select round(rand(checksum(newid()))*(10)+20,2)

这里的随机数在20和30之间。 四舍五入最多会给出两位小数点后的数字。

如果你想要负数,你可以这样做

select round(rand(checksum(newid()))*(10)-60,2)

那么最小值将是-60,最大值将是-50。

其他回答

如果你需要保存你的种子,以便它每次生成“相同”的随机数据,你可以做以下事情:

1. 创建一个返回select rand()的视图

if object_id('cr_sample_randView') is not null
begin
    drop view cr_sample_randView
end
go

create view cr_sample_randView
as
select rand() as random_number
go

2. 创建一个从视图中选择值的UDF。

if object_id('cr_sample_fnPerRowRand') is not null
begin
    drop function cr_sample_fnPerRowRand
end
go

create function cr_sample_fnPerRowRand()
returns float
as
begin
    declare @returnValue float
    select @returnValue = random_number from cr_sample_randView
    return @returnValue
end
go

3.在选择数据之前,输入rand()函数,然后在选择语句中使用UDF。

select rand(200);   -- see the rand() function
with cte(id) as
(select row_number() over(order by object_id) from sys.all_objects)
select 
    id,
    dbo.cr_sample_fnPerRowRand()
from cte
where id <= 1000    -- limit the results to 1000 random numbers

试试这个:

SELECT RAND(convert(varbinary, newid()))*(b-a)+a magic_number 

a是较小的数,b是较大的数

我有时对所选“答案”的问题是,分布并不总是均匀的。如果您需要在大量行中随机分布1 - 14,您可以这样做(我的数据库有511个表,所以这是可行的。如果你的行数比你的随机数跨度少,这就行不通了):

SELECT table_name, ntile(14) over(order by newId()) randomNumber 
FROM information_schema.tables

这种方法与普通随机解相反因为它保持了数字的顺序并使另一列随机化。

请记住,我的数据库中有511个表(这只与我们从information_schema中选择的b/c相关)。如果我把前面的查询放到临时表#X中,然后对结果数据运行这个查询:

select randomNumber, count(*) ct from #X
group by randomNumber

我得到这个结果,显示我的随机数非常均匀地分布在许多行中:

您需要为每一行调用RAND()。这里有一个很好的例子

https://web.archive.org/web/20090216200320/http://dotnet.org.za/calmyourself/archive/2007/04/13/sql-rand-trap-same-value-per-row.aspx

尝试在RAND中使用种子值(seedInt)。RAND()每条语句只执行一次,这就是为什么每次都看到相同的数字。