T-SQL使用RAND(种子)随机化结果顺序

时间:2014-07-14 15:03:09

标签: sql tsql random sql-server-2012

我使用以下语句(这是一个缩短版本作为示例)从Microsoft SQL Express 2012数据库中获取结果:

SELECT id, name, city 
FROM tblContact 
ORDER BY RAND(xxx)

并为xxx部分注入存储在会话中的种子,以便结果对于给定会话始终是随机的(因此,当通过结果进行分页时,用户不会看到重复项)

问题:无论种子是什么,结果都以相同的顺序返回

我也试过这个:

SELECT id, name, city, RAND(xxx) AS OrderValue 
FROM tblContact 
ORDER BY OrderValue

两者都给出相同的(意外结果) - 我是否错误地使用了它?

3 个答案:

答案 0 :(得分:4)

整个查询的rand(seed)值相同,我想使用ID列在每行的行上生成随机值:

SELECT id, name, city, RAND(xxx + id) AS OrderValue 
  FROM tblContact ORDER BY OrderValue

但是我过去一直在开发一些功能,我需要为不同的会话提供随机顺序,但同一会话中的顺序相同。那时我使用了HASHBYTES()并且效果非常好:

 SELECT id, name, city, HASHBYTES('md5',cast(xxx+id as varchar)) AS OrderValue 
   FROM tblContact ORDER BY OrderValue

答案 1 :(得分:1)

通常,newid()函数用于此目的:

SELECT id, name, city
FROM tblContact
ORDER BY newid();

我听说rand(checksum(newid()))实际上有更好的属性作为随机数生成器:

SELECT id, name, city
FROM tblContact
ORDER BY rand(checksum(newid()));

如果您希望从一个查询到下一个查询的结果一致,那么@ dimt的解决方案使用id或函数id

答案 2 :(得分:0)

在SQL Server中,Rand()为查询计算一次。要获得随机订单,请使用ORDER BY NEWID()。