SQL Server返回随机记录

###常见的,不一定是最好的
说到返回随机行,很人一般会想到用GUID来排序,这是网上最常用的解决方案:

Select Top 100 * From Sales.SalesOrderDetail
Order By NewID()

但是这个方案的性能并不很好,因为无法使用索引,每次还要对GUID进行排序

###TableSample
这是MSSQL2005开始出现的关键字,TableSample可以用来快速返回样本行数据:

SELECT * FROM Sales.SalesOrderDetail TABLESAMPLE(100 ROWS)

实际使用后,却发现这个写法每次都返回不同的行数,甚至返回0行,后来知道它随机选取的单位是数据页。

###真正的随机返回
下面这个写法是从TableSample的帮助文档中发现的,真正的随机返回,而且效率惊人:

SELECT Top 100 * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)/ CAST (0x7fffffff AS int)