Sql server SQL Server中的字母数字序列
我需要在SQL Server 2008中生成一个3个字符的字母数字序列,如下所示: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
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