• Since the case statement is doing incremental steps, it can be simplified using integer division, see the example.

    😎

    USE tempdb;

    GO

    SET NOCOUNT ON;

    DECLARE @SET_SIZE INT = 40000;

    /* Test data 1 to @SET_SIZE */

    ;WITH T(N) AS (SELECT N FROM (VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) AS X(N))

    ,NUMS(N) AS (SELECT TOP(@SET_SIZE) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM T T1, T T2, T T3, T T4, T T5, T T6, T T7)

    SELECT

    NM.N AS BATCH

    -- UNCOMMEMNT THE FOLLOWING LINES TO ASSERT THE LOGIC

    --,FLOOR(NM.N / 1000) AS GroupNo

    --,CHAR(FLOOR(NM.N / 1000) + 55) AS GroupChar

    ,CASE

    WHEN NM.N BETWEEN 10000 AND 35999 THEN CHAR(FLOOR(NM.N / 1000) + 55) + RIGHT(CAST(NM.N AS VARCHAR(12)),3)

    WHEN NM.N < 10000 THEN CAST(NM.N AS VARCHAR(4))

    ELSE ''

    END AS [DDP_BATCH_#]

    FROM NUMS NM

    WHERE NM.N > 9990;