gpt4 book ai didi

SQL 序列在 case 语句中使用时跳过值

转载 作者:行者123 更新时间:2023-12-05 05:36:02 25 4
gpt4 key购买 nike

使用 SQL Server 2016,当另一个值不为空时,我尝试使用序列自动将值插入到列中。但是,如果 case 值为 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

这个问题可以解决吗?我在这里不知所措。谢谢!

最佳答案

问题是,您总是通过以下语句生成下一个序列号:

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

关于SQL 序列在 case 语句中使用时跳过值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73368514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com