Tsql ABS(校验和(NEWID())%4生成意外值

Tsql ABS(校验和(NEWID())%4生成意外值,tsql,random,checksum,newid,Tsql,Random,Checksum,Newid,以下transact-sql代码工作正常。它按预期用四个整数(0、1、2、3)填充表格 CREATE TABLE [TBL_INTEGER] ( [ID] INTEGER IDENTITY ( 1, 1 ) PRIMARY KEY, [NUMBER] INTEGER NOT NULL ) DECLARE @MAX INTEGER SELECT @MAX = 1000 WHILE ( 0 < @MAX ) BEGIN INSERT [TBL_INTEGER] (

以下transact-sql代码工作正常。它按预期用四个整数(0、1、2、3)填充表格

CREATE TABLE [TBL_INTEGER] (
    [ID] INTEGER IDENTITY ( 1, 1 ) PRIMARY KEY,
    [NUMBER] INTEGER NOT NULL
)

DECLARE @MAX INTEGER
SELECT @MAX = 1000

WHILE ( 0 < @MAX ) BEGIN
    INSERT [TBL_INTEGER] ( [NUMBER] ) SELECT ABS ( CHECKSUM ( NEWID () ) ) % 4
    SELECT @MAX = @MAX - 1
END
代码没有失败。但三分之一的插入行包含值99

有什么解释吗

提前谢谢你


av

这真的很有趣。。。我使用了一种不同的随机数生成方法,结果相同,既作为
案例X
,也作为
案例X=0
。似乎任何时候在案例陈述中进行计算时,都会遗漏一个节拍。添加一个isnull()会导致更多的null,这很有趣。。。文章解释了搜索到的
案例
表达式可能会重新评估搜索项。在本例中,可能会针对每个搜索值(0、1、2和3)重新计算表达式,并且四个单独计算的值都不匹配,因此
案例
的默认值为
NULL
。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和功能的差异通常会影响答案。亲爱的@habo,谢谢你的文章!它解释了我的代码的行为。这真的很有趣。。。我使用了一种不同的随机数生成方法,结果相同,既作为
案例X
,也作为
案例X=0
。似乎任何时候在案例陈述中进行计算时,都会遗漏一个节拍。添加一个isnull()会导致更多的null,这很有趣。。。文章解释了搜索到的
案例
表达式可能会重新评估搜索项。在本例中,可能会针对每个搜索值(0、1、2和3)重新计算表达式,并且四个单独计算的值都不匹配,因此
案例
的默认值为
NULL
。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和功能的差异通常会影响答案。亲爱的@habo,谢谢你的文章!它解释了我的代码的行为。
CREATE TABLE [TBL_INTEGER] (
    [ID] INTEGER IDENTITY ( 1, 1 ) PRIMARY KEY,
    [NUMBER] INTEGER NOT NULL
)

DECLARE @MAX INTEGER
SELECT @MAX = 1000

WHILE ( 0 < @MAX ) BEGIN
    INSERT [TBL_INTEGER] ( [NUMBER] )
        SELECT
            CASE ABS ( CHECKSUM ( NEWID () ) ) % 4
                WHEN 0 THEN 0
                WHEN 1 THEN 1
                WHEN 2 THEN 2
                WHEN 3 THEN 3
            END
    SELECT @MAX = @MAX - 1
END
ELSE 99