tsql - SQL 中使用游标生成序列码的问题
问题描述
代码似乎正确,但输出错误,如果我做错了什么,请纠正我
这是表“LoadData”
序列_CD | ID | 今年 | 记录_DT | 地位 |
---|---|---|---|---|
18AA | 109754BY6 | 2018 | 2018-01-01 | ü |
19AA | 222367DY7 | 2019 | 2019-02-22 | 一个 |
19AB | 222367DY7 | 2019 | 2020-05-26 | 一个 |
无效的 | 222367DY7 | 2019 | 2020-06-06 | 一个 |
无效的 | 222367DY7 | 2021 | 2020-06-06 | 一个 |
无效的 | 29276KAR2 | 2021 | 2020-06-01 | 一个 |
无效的 | 29276KAR2 | 2021 | 2020-07-06 | 一个 |
我只需要为那些状态为“A”的 ID 生成“Sequence_Code”
字母“Sequence_Code”是“Current_Year”的最后两位数字和 2 个字符字母(如 AA、AB、AC....AZ)的组合,
BA,BB,BC ... BZ。CA,CB,CC....
下面的函数给了我下一个序列代码:
Create FUNCTION [dbo].[GetNextSequenceCode_TEST] (@LastSeqAlphabet varchar(100))
RETURNS varchar(100)
AS
BEGIN
DECLARE @fPart varchar(100), @lChar CHAR(1);
IF(@LastSeqAlphabet IS NULL OR @LastSeqAlphabet = '')
RETURN 'AA';
SELECT @fPart = LEFT(@LastSeqAlphabet, LEN(@LastSeqAlphabet) - 1);
SELECT @lChar = RIGHT(@LastSeqAlphabet, 1);
IF(@lChar = 'Z')
RETURN (SELECT [dbo].[GetNextSequenceCode_TEST](@fPart)) + 'A';
RETURN @fPart + CHAR(ASCII(@lChar)+1);
END
表具有重复的 ID,每一行都有不同的数据(如“Record_DT”)。
Sequence_CD 必须根据 ID 和 Current Year 生成。
规则:
如果 ID 已经有 Sequence_CD,那么对于具有相同 ID 和 Tax_year 的下一条记录,代码应该取 Sequence_CD 的最大值(相同 ID 和 CurrentYear 的现有值),并且它应该为下一行增加 1。并更新它在表中。
如果 ID 没有 Sequence_CD,那么它应该从 'AA' 即 CurrentYear(仅考虑最后 2 位)+'AA' 生成它
如果 ID 存在于另一个 Current_Year,这里 Sequence_CD 也应该类似于 CurrentYear(仅考虑最后 2 位)+'AA'
对于每条记录,我需要遵循上述规则,我正在使用光标执行此操作
DECLARE @ID Varchar(9);
DECLARE @Current_Year Varchar(4);
DECLARE @Record_DT date;
DECLARE @Seq_CD VARCHAR(4);
DECLARE @GeneratedSeq_CD varchar(20);
DECLARE @InsertedRecordsCursor as CURSOR;
--DECLARE @FileName VARCHAR(500);
BEGIN
SET @InsertedRecordsCursor = CURSOR FOR
select ID,Current_Year,Record_DT from TestTable
where Sequencement_CD IS NULL AND Status ='A'
OPEN @InsertedRecordsCursor;
FETCH NEXT FROM @InsertedRecordsCursor INTO @ID,@Current_Year,@Record_DT
WHILE @@FETCH_STATUS = 0
BEGIN
Select top 1 @Seq_CD = Substring(Sequencement_CD,3,2) from TestTable
where Current_Year = @Current_Year And ID = @ID
AND Sequencement_CD IS NOT NULL
ORDER BY Sequencement_CD desc
IF(@Seq_CD IS NULL OR @Seq_CD = '')
Set @Seq_CD = '';
UPDATE TestTable
SET Sequencement_CD = (RIGHT(@Current_Year,2)) + dbo.GetNextSequenceCode_TEST (RTRIM(@Seq_CD))
WHERE ID = @ID And Current_Year = @Current_Year
And Record_DT = @Record_DT
FETCH NEXT FROM @InsertedRecordsCursor INTO @ID,@Current_Year,@Record_DT
END;
CLOSE @InsertedRecordsCursor ;
DEALLOCATE @InsertedRecordsCursor;
END;
预期输出:
序列_CD | ID | 今年 | 记录_DT | 地位 |
---|---|---|---|---|
18AA | 109754BY6 | 2018 | 2018-01-01 | ü |
19AA | 222367DY7 | 2019 | 2019-02-22 | 一个 |
19AB | 222367DY7 | 2019 | 2020-05-26 | 一个 |
19AC | 222367DY7 | 2019 | 2020-06-06 | 一个 |
21AA | 222367DY7 | 2021 | 2020-06-06 | 一个 |
21AA | 29276KAR2 | 2021 | 2020-06-01 | 一个 |
21AB | 29276KAR2 | 2021 | 2020-07-06 | 一个 |