数据库表中的随机logging(T-SQL)

有一个简洁的方法来从SQL Server表中检索一个随机logging?

我想随机化我的unit testing数据,所以我正在寻找一个简单的方法来从表中select一个随机的ID。 在英文中,select将是“从表中select一个id,其中id是表中最低的id和表中最高的id之间的随机数。

我不能找出一种方法来做到这一点,而不必运行查询,testing一个空值,然后重新运行,如果为空。

想法?

有一个简洁的方法来从SQL Server表中检索一个随机logging?

SELECT TOP 1 * FROM table ORDER BY NEWID() 

说明

NEWID()是为每一行生成的,然后按表对它进行sorting。 第一个logging被返回(即具有“最低”GUID的logging)。

笔记

  1. 从版本4开始,GUID被生成为伪随机数:

    版本4 UUID用于从真随机或伪随机数字生成UUID。

    algorithm如下:

    • 将clock_seq_hi_and_reserved的两个最高有效位(位6和7)分别设置为0和1。
    • 将time_hi_and_version字段的四个最高有效位(第12到15位)设置为第4.1.3节中的4位版本号。
    • 将所有其他位设置为随机(或伪随机)select的值。

    – 通用唯一标识符(UUID)URN命名空间 – RFC 4122

  2. 另外SELECT TOP 1 * FROM table ORDER BY RAND()将不会像人们想象的那样工作。 RAND()为每个查询返回一个单一值,因此所有行将共享相同的值。

  3. 虽然GUID值是伪随机的,但对于要求更高的应用程序,您将需要更好的PRNG。

  4. 对于大约1,000,000行,典型性能不到10秒 – 当然取决于系统。 请注意,这是不可能的指标,因此performance将相对有限。

在较大的表格上,您也可以使用TABLESAMPLE来避免扫描整个表格。

 SELECT TOP 1 * FROM YourTable TABLESAMPLE (1000 ROWS) ORDER BY NEWID() 

ORDER BY NEWID仍然是必需的,以避免只返回数据页上第一个出现的行。

要使用的数字需要仔细select表的大小和定义,如果没有行返回,您可以考虑重试逻辑。 这里的math和为什么这种技术不适合小桌子在这里讨论

也尝试你的方法来获得一个随机ID之间MIN(Id)和MAX(Id)然后

 SELECT TOP 1 * FROM table WHERE Id >= @yourrandomid 

它会一直让你一排。

如果你想select大数据,我知道的最好的方法是:

 SELECT * FROM Table1 WHERE (ABS(CAST( (BINARY_CHECKSUM (keycol1, NEWID())) as int)) % 100) < 10 

来源: MSDN

我正在寻求改进我尝试过的方法,并通过这篇文章。 我意识到这是旧的,但这种方法没有列出。 我正在创build和应用testing数据; 这显示了在用@st(两个字符状态)调用的SP中的“地址”

 Create Table ##TmpAddress (id Int Identity(1,1), street VarChar(50), city VarChar(50), st VarChar(2), zip VarChar(5)) Insert Into ##TmpAddress(street, city, st, zip) Select street, city, st, zip From tbl_Address (NOLOCK) Where st = @st -- unseeded RAND() will return the same number when called in rapid succession so -- here, I seed it with a guaranteed different number each time. @@ROWCOUNT is the count from the most recent table operation. Set @csr = Ceiling(RAND(convert(varbinary, newid())) * @@ROWCOUNT) Select street, city, st, Right(('00000' + ltrim(zip)),5) As zip From ##tmpAddress (NOLOCK) Where id = @csr