提问人:Ian 提问时间:8/16/2022 更新时间:8/16/2022 访问量:268
SQL 序列在 case 语句中使用时会跳过值
SQL Sequence is skipping values when used in a case statement
问:
使用 SQL Server 2016,当另一个值不为 null 时,我尝试使用序列自动将值插入到列中。但是,如果大小写值为 null,则下一个非 null NEXT VALUE FOR 将增加其前面的 null 值。我不确定如何防止这种情况发生。代码如下:
用于创建序列的存储过程的相关部分:
DECLARE @IdMax INT;
SELECT @IdMax = (MAX(CAST(Id AS Int)) + 1) from [db].[dbo].[table] WHERE ISNUMERIC(Id) = 1;
EXEC('CREATE SEQUENCE Id_Sequence
START WITH ' + @IdMax + '
INCREMENT BY 1
CACHE 1000;')
而粗略的测试实现:
DECLARE @StartDate date
SET @StartDate = '20220816'
DECLARE @IDSequenceValue int
SET @IDSequenceValue = CAST(NEXT VALUE FOR Id_Sequence as nvarchar(7))
INSERT INTO dbo.table (
StartDate,
Id)
Values (
@StartDate,
CASE
WHEN @StartDate IS NULL THEN NULL
ELSE @IdSequenceValue
END);
该代码已被删节,以删除可识别的信息。我必须将 NEXT VALUE FOR 语句声明为变量,以避免无法直接在 Case 语句中使用它。我的删节输出是:
StartDate Id
2022-08-17 5078561
NULL NULL
NULL NULL
2022-08-17 5078558
2022-08-17 5078557
NULL NULL
2022-08-17 5078555
2022-08-17 5078554
2022-08-17 5078553
这个问题可以克服吗?我在这里不知所措。谢谢!
答:
1赞
Md. Suman Kabir
8/16/2022
#1
问题是,您总是通过以下语句生成下一个序列号:
SET @IDSequenceValue = CAST(NEXT VALUE FOR Id_Sequence as nvarchar(7))
在表达式中,有条件地使用该值。为了解决这个问题,我建议仅在需要像这样使用时才生成下一个序列号:CASE
if @StartDate IS NOT NULL
begin
SET @IDSequenceValue = CAST(NEXT VALUE FOR Id_Sequence as nvarchar(7))
end
评论
1赞
Alex
8/16/2022
“消息 11741,级别 15,状态 1,第 19 行 NEXT VALUE FOR 函数不能在 CASE、CHOOSE、COALESCE、IIF、ISNULL 和 NULL 中使用。
0赞
Md. Suman Kabir
8/16/2022
@Alex已更正
评论
Id
SELECT (MAX+1)
CASE
CASE