手记小心在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的数字,但多跑两次,你会得到各种神奇的结果,有返回两行的,有不返回的,肥肠蹊跷,一度让我怀疑人生,直到发现我不是一个人:
所以无法解决,只能插旗备忘,以后绕开,希望能给已经这样用或可能这样用的朋友提个醒。
-文毕-
以上是关于手记小心在where中使用NEWID()的大坑的主要内容,如果未能解决你的问题,请参考以下文章