手记小心在where中使用NEWID()的大坑

Posted AhDung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手记小心在where中使用NEWID()的大坑相关的知识,希望对你有一定的参考价值。

这个表达式:

ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模

是随机返回0、1、2这三个数,不可能返回其它东西,但是如果把它用在where里面,就会发生很神奇的事情,比如这个查询:

--创建一个只有1列3行的表,存放0,1,2三个值
DECLARE @t TABLE(Col1 int)
INSERT @t
SELECT 0 UNION ALL
SELECT 1 UNION ALL
SELECT 2

--然后随机查一行
SELECT *
FROM @t
WHERE Col1 = ABS(CHECKSUM(NEWID())) % 3

按说每次执行会且只会得到一个0~2的数字,但多跑两次,你会得到各种神奇的结果,有返回两行的,有不返回的,肥肠蹊跷,一度让我怀疑人生,直到发现我不是一个人:

https://stackoverflow.com/questions/38498513/odd-sql-server-tsql-query-results-with-newid-in-the-where-clause

所以无法解决,只能插旗备忘,以后绕开,希望能给已经这样用或可能这样用的朋友提个醒。

-文毕-

以上是关于手记小心在where中使用NEWID()的大坑的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList#subList这四个坑,一不小心就中招

GJM: Unity3D AssetBundle 手记

Linux 随手记

如何将 NEWID() / GUID / UUID 插入代码编辑器?

手记走近科学之为什么JObject不能调用LINQ扩展方法

时间随手记