Sql server SQL Server中的字母数字序列

Sql server SQL Server中的字母数字序列,sql-server,sequence,alphanumeric,Sql Server,Sequence,Alphanumeric,我需要在SQL Server 2008中生成一个3个字符的字母数字序列,如下所示: 001, 002, ..., 999, A01, A02, ..., A99, B01, B02, ..., Z99 序列中的下一项将从存储过程生成,并存储在NCHAR(3)表列中。要获得下一个序列,可以添加Id如下 WITH seq AS ( SELECT ROW_NUMBER() OVER (ORDER BY x.alpha + y.number + z.number) AS Id

我需要在SQL Server 2008中生成一个3个字符的字母数字序列,如下所示:

001,
002,
...,
999,
A01,
A02,
...,
A99,
B01,
B02,
...,
Z99

序列中的下一项将从存储过程生成,并存储在
NCHAR(3)
表列中。

要获得下一个序列,可以添加
Id
如下

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')
结果

Z02

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

建议的存储过程的另一种方法是使用@user2864740建议的交叉连接,并使用一个名为@pLastUsed的参数。SP然后返回序列中的下一个。注意:这将适用于所有版本的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

共享一个在SQL Server中生成字母数字序列号的示例

创建示例表:

CREATE TABLE dbo.tbl_TestVarcharSequence
(
    VarcharID VARCHAR(10)
    ,Name VARCHAR(255)
    ,CONSTRAINT pk_tbl_TestVarcharSequence_VarcharID PRIMARY KEY(VarcharID)
)
GO
CREATE SEQUENCE dbo.seq_TestVarcharSequenceNumber AS 
INT START WITH 1
INCREMENT BY 1;
GO
ALTER TABLE dbo.tbl_TestVarcharSequence
ADD CONSTRAINT seq_tbl_TestVarcharSequence_VarcharID DEFAULT 
FORMAT((NEXT VALUE FOR dbo.seq_TestVarcharSequenceNumber),'ABC00#') 
FOR VarcharID;
GO
INSERT INTO dbo.tbl_TestVarcharSequence (Name) 
VALUES ('Anvesh'),('Alex'),('Roy'),('Bony')
GO
SELECT * FROM dbo.tbl_TestVarcharSequence

ABC001     Anvesh
ABC002     Alex
ABC003     Roy
ABC004     Bony
创建样本序列对象:

CREATE TABLE dbo.tbl_TestVarcharSequence
(
    VarcharID VARCHAR(10)
    ,Name VARCHAR(255)
    ,CONSTRAINT pk_tbl_TestVarcharSequence_VarcharID PRIMARY KEY(VarcharID)
)
GO
CREATE SEQUENCE dbo.seq_TestVarcharSequenceNumber AS 
INT START WITH 1
INCREMENT BY 1;
GO
ALTER TABLE dbo.tbl_TestVarcharSequence
ADD CONSTRAINT seq_tbl_TestVarcharSequence_VarcharID DEFAULT 
FORMAT((NEXT VALUE FOR dbo.seq_TestVarcharSequenceNumber),'ABC00#') 
FOR VarcharID;
GO
INSERT INTO dbo.tbl_TestVarcharSequence (Name) 
VALUES ('Anvesh'),('Alex'),('Roy'),('Bony')
GO
SELECT * FROM dbo.tbl_TestVarcharSequence

ABC001     Anvesh
ABC002     Alex
ABC003     Roy
ABC004     Bony
使用格式函数创建序列约束:

CREATE TABLE dbo.tbl_TestVarcharSequence
(
    VarcharID VARCHAR(10)
    ,Name VARCHAR(255)
    ,CONSTRAINT pk_tbl_TestVarcharSequence_VarcharID PRIMARY KEY(VarcharID)
)
GO
CREATE SEQUENCE dbo.seq_TestVarcharSequenceNumber AS 
INT START WITH 1
INCREMENT BY 1;
GO
ALTER TABLE dbo.tbl_TestVarcharSequence
ADD CONSTRAINT seq_tbl_TestVarcharSequence_VarcharID DEFAULT 
FORMAT((NEXT VALUE FOR dbo.seq_TestVarcharSequenceNumber),'ABC00#') 
FOR VarcharID;
GO
INSERT INTO dbo.tbl_TestVarcharSequence (Name) 
VALUES ('Anvesh'),('Alex'),('Roy'),('Bony')
GO
SELECT * FROM dbo.tbl_TestVarcharSequence

ABC001     Anvesh
ABC002     Alex
ABC003     Roy
ABC004     Bony
插入少量样本记录:

CREATE TABLE dbo.tbl_TestVarcharSequence
(
    VarcharID VARCHAR(10)
    ,Name VARCHAR(255)
    ,CONSTRAINT pk_tbl_TestVarcharSequence_VarcharID PRIMARY KEY(VarcharID)
)
GO
CREATE SEQUENCE dbo.seq_TestVarcharSequenceNumber AS 
INT START WITH 1
INCREMENT BY 1;
GO
ALTER TABLE dbo.tbl_TestVarcharSequence
ADD CONSTRAINT seq_tbl_TestVarcharSequence_VarcharID DEFAULT 
FORMAT((NEXT VALUE FOR dbo.seq_TestVarcharSequenceNumber),'ABC00#') 
FOR VarcharID;
GO
INSERT INTO dbo.tbl_TestVarcharSequence (Name) 
VALUES ('Anvesh'),('Alex'),('Roy'),('Bony')
GO
SELECT * FROM dbo.tbl_TestVarcharSequence

ABC001     Anvesh
ABC002     Alex
ABC003     Roy
ABC004     Bony
结果:

CREATE TABLE dbo.tbl_TestVarcharSequence
(
    VarcharID VARCHAR(10)
    ,Name VARCHAR(255)
    ,CONSTRAINT pk_tbl_TestVarcharSequence_VarcharID PRIMARY KEY(VarcharID)
)
GO
CREATE SEQUENCE dbo.seq_TestVarcharSequenceNumber AS 
INT START WITH 1
INCREMENT BY 1;
GO
ALTER TABLE dbo.tbl_TestVarcharSequence
ADD CONSTRAINT seq_tbl_TestVarcharSequence_VarcharID DEFAULT 
FORMAT((NEXT VALUE FOR dbo.seq_TestVarcharSequenceNumber),'ABC00#') 
FOR VarcharID;
GO
INSERT INTO dbo.tbl_TestVarcharSequence (Name) 
VALUES ('Anvesh'),('Alex'),('Roy'),('Bony')
GO
SELECT * FROM dbo.tbl_TestVarcharSequence

ABC001     Anvesh
ABC002     Alex
ABC003     Roy
ABC004     Bony

到目前为止,您是否编写过代码?您使用的是什么版本的sql server?解决此问题的“关系”方法是交叉连接[A-Z]、[0-9]、[0-9]。然后连接这些值并对结果排序。否则,可以采用更迫切的方法。如果需要恢复上一个序列(例如,仅获取下一个值),问题会发生一些变化。Z99之后会发生什么?你们要接ZA1吗?第一个数字需要0-9和alpha,而不仅仅是0和alpha。@James谢谢,我错过了it@Eric,回答得很好,但总数不是3600吗?(36*10*10)或3599,因为没有使用“000”。@JohnS,因为不包括A00、B00等,即3573=3600-1-26