首页 > 解决方案 > 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 生成。

规则:

  1. 如果 ID 已经有 Sequence_CD,那么对于具有相同 ID 和 Tax_year 的下一条记录,代码应该取 Sequence_CD 的最大值(相同 ID 和 CurrentYear 的现有值),并且它应该为下一行增加 1。并更新它在表中。

  2. 如果 ID 没有 Sequence_CD,那么它应该从 'AA' 即 CurrentYear(仅考虑最后 2 位)+'AA' 生成它

  3. 如果 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 一个

标签: tsqlsql-server-2017seq

解决方案


推荐阅读