ABS(CHECKSUM(NEWID()))%4生成意外值

时间:2017-06-25 20:32:18

标签: 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] ( [NUMBER] ) SELECT ABS ( CHECKSUM ( NEWID () ) ) % 4
    SELECT @MAX = @MAX - 1
END

并且以下代码没有。它无法生成'无法将值NULL插入列'NUMBER'错误。

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

代码不会失败。但是插入行的三分之一包含值99。

有解释吗?

提前谢谢你!

AV

0 个答案:

没有答案