Tsql ABS(校验和(NEWID())%4生成意外值
以下transact-sql代码工作正常。它按预期用四个整数(0、1、2、3)填充表格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] (
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