发生这种情况的原因是因为NEWID()为表中的每一行提供了不同的值。对于每一行, 独立于其他行
,有五分之一的机会将其返回。因此,就目前而言,实际上所有5行返回的概率为3125分之一!
要查看此信息,请运行以下查询。您会看到每一行都有一个不同的ID。
SELECt * , NEWID()FROM @Table
这将修复您的代码:
DECLARE @Id intSET @Id = ABS(CHECKSUM(NEWID())) % 5 + 1SELECt * FROM @Table WHERe ID = @Id
但是,我不确定这是从表中选择单个随机行的最有效方法。
您可能会发现此MSDN文章很有用:http :
//msdn.microsoft.com/zh-cn/library/Aa175776(T-SQL中的随机抽样)
编辑1 :现在我考虑一下, 假设行数保持固定并且ID保证是连续的 ,这可能是最有效的方法。
编辑2 :当用作子查询时,要获得所需的结果,请使用TOP 1,如下所示:
SELECt t.ID , FK1 = (SELECT TOP 1 FK1 FROM @Table ORDER BY NEWID()) FROM @Table t



