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

SELECT table_name, RAND() magic_number 
FROM information_schema.tables 

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

这是为Microsoft SQL Server 2000。


当前回答

我有时对所选“答案”的问题是,分布并不总是均匀的。如果您需要在大量行中随机分布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

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

其他回答

select ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) as [Randomizer]

一直对我有效吗

当在单个批处理中多次调用rand()时,将返回相同的数字。

我建议使用convert(varbinary,newid())作为种子参数:

SELECT table_name, 1.0 + floor(14 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

Newid()保证每次调用都会返回不同的值,即使是在同一个批处理中,因此将它作为种子将提示rand()每次给出不同的值。

编辑以获得从1到14的随机整数。

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

RAND(CHECKSUM(NEWID()))

上面将生成一个(伪)随机数,介于0和1之间,不排除。如果在选择中使用,因为种子值每一行都在变化,它将为每一行生成一个新的随机数(但不保证每一行生成一个唯一的数字)。

当与10的上限组合时(产生数字1 - 10):

CAST(RAND(CHECKSUM(NEWID())) * 10 as INT) + 1

transact - sql批量文档:

演员():https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql 兰德():http://msdn.microsoft.com/en-us/library/ms177610.aspx (): http://msdn.microsoft.com/en-us/library/ms189788.aspx校验和 NEWID (): https://learn.microsoft.com/en-us/sql/t-sql/functions/newid-transact-sql

试试这个:

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

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