Alpha-numeric sequence in SQL Server

徘徊边缘 提交于 2019-12-05 06:07:19

To get the next sequence you can add a Id like

WITH seq AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY x.alpha + y.number + z.number) AS Id,
        CONVERT(nchar(3), x.alpha + y.number + z.number) AS Result
    FROM 
        (
            VALUES 
            ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'),
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z')
        ) x(alpha),
        (
            VALUES 
            ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
        ) y(number),
        (
            VALUES 
            ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
        ) z(number)
    WHERE
       NOT (NOT x.alpha BETWEEN '1' AND '9' AND y.number = '0' AND z.number = '0')
)
-- Uncomment to see all results
--SELECT * FROM seq

SELECT Result FROM seq WHERE Id = (SELECT Id + 1 FROM seq WHERE Result = 'Z01')

Result

Z02

Full count = 3573 = 999 + (26 * 99)

Another approach for your proposed stored procedure would be to use CROSS JOINs as suggested by @user2864740 and have a parameter called @pLastUsed. The SP then returns the next one in the sequence. NB This will work for all version of SQL Server.

CREATE PROCEDURE NextID 
    @pLastUsed CHAR(3) 
AS
/* Usage
EXEC NextID 'J64'

*/
BEGIN
    SET NOCOUNT ON;
  DECLARE @T1 TABLE (Col CHAR(1))
  DECLARE @T2 TABLE (Col CHAR(1))
  DECLARE @T3 TABLE (Col CHAR(1))
  INSERT @T1 ( Col ) SELECT '0' UNION ALL SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' 
                                UNION ALL SELECT '5' UNION ALL SELECT '6' UNION ALL SELECT '7' UNION ALL SELECT '8' 
                                UNION ALL SELECT '9' UNION ALL SELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'C'
                                UNION ALL SELECT 'D' UNION ALL SELECT 'E' UNION ALL SELECT 'F' UNION ALL SELECT 'G'
                                UNION ALL SELECT 'H' UNION ALL SELECT 'I' UNION ALL SELECT 'J' UNION ALL SELECT 'K'
                                UNION ALL SELECT 'L' UNION ALL SELECT 'M' UNION ALL SELECT 'N' UNION ALL SELECT 'O'
                                UNION ALL SELECT 'P' UNION ALL SELECT 'Q' UNION ALL SELECT 'R' UNION ALL SELECT 'S'
                                UNION ALL SELECT 'T' UNION ALL SELECT 'U' UNION ALL SELECT 'V' UNION ALL SELECT 'W'
                                UNION ALL SELECT 'X' UNION ALL SELECT 'Y' UNION ALL SELECT 'Z'
  INSERT @T2 ( Col ) SELECT '0' UNION ALL SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' 
                                UNION ALL SELECT '5' UNION ALL SELECT '6' UNION ALL SELECT '7' UNION ALL SELECT '8' 
                                UNION ALL SELECT '9'
  INSERT @T3 ( Col ) SELECT '0' UNION ALL SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' 
                                UNION ALL SELECT '5' UNION ALL SELECT '6' UNION ALL SELECT '7' UNION ALL SELECT '8' 
                                UNION ALL SELECT '9'
  SELECT TOP 1
    t1.Col + t2.Col + t3.Col
  FROM
    @T1 t1
    CROSS JOIN @T2 AS t2
    CROSS JOIN @T3 AS t3
  WHERE
    t1.Col + t2.Col + t3.Col > @pLastUsed
  ORDER BY
    t1.Col + t2.Col + t3.Col
END
GO

Sharing one example to generate Alphanumeric Sequence Number in SQL Server.

For more reference, You can visit this article.

Create sample table:

CREATE TABLE dbo.tbl_TestVarcharSequence
(
    VarcharID VARCHAR(10)
    ,Name VARCHAR(255)
    ,CONSTRAINT pk_tbl_TestVarcharSequence_VarcharID PRIMARY KEY(VarcharID)
)
GO

Create a Sample Sequence object:

CREATE SEQUENCE dbo.seq_TestVarcharSequenceNumber AS 
INT START WITH 1
INCREMENT BY 1;
GO

Create Sequence constraint using FORMAT function:

ALTER TABLE dbo.tbl_TestVarcharSequence
ADD CONSTRAINT seq_tbl_TestVarcharSequence_VarcharID DEFAULT 
FORMAT((NEXT VALUE FOR dbo.seq_TestVarcharSequenceNumber),'ABC00#') 
FOR VarcharID;
GO

Insert few sample records:

INSERT INTO dbo.tbl_TestVarcharSequence (Name) 
VALUES ('Anvesh'),('Alex'),('Roy'),('Bony')
GO

The Result:

SELECT * FROM dbo.tbl_TestVarcharSequence

ABC001     Anvesh
ABC002     Alex
ABC003     Roy
ABC004     Bony
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!