我有一张名为tblPacks
的表。
CREATE TABLE [dbo].[tblPacks]
(
[ID] [int] NOT NULL,
[BatchNumber] [varchar](30) NULL,
[PackID] VARCHAR(50),
[Status] [int] NULL
)
存储过程spInsertPacks
。
CREATE PROCEDURE spInsertPacks
@ID INT,
@BatchNumber VARCHAR(30),
@Count INT
AS
BEGIN
INSERT INTO tblPacks
Values
(
@ID,
@BatchNumber,
CONVERT([varchar](50),
'PK'+
case
when len(@ID)<=(3) then CONVERT([varchar](20),right((0.001)*@ID,(3)),0)
else CONVERT([varchar](20),@ID,0)
end,0),0)
END
如果以1,2,3,4,5等顺序插入数据类型INT的ID,则上述逻辑工作正常。但是用户输入随机数没有限制。我希望存储过程按顺序生成PackID(PK001,PK002..)
序列,而不管@ID
和ID
。不能是身份列。我怎样才能做到这一点?
实际上这个PackID是条形码如果条形码已经存在于Pack中,那么该序列可能与我们使用的序列不同,我们生成的新生成的条形码将在序列PK001中
样本输出: -
ID BatchNumber PackID Status
1 b1 PK001 0
1 b2 Pk002 0
5 b7 ABC768 0
3 b2 PK003 0
答案 0 :(得分:0)
我已经简化了生成PackID
添加新列(identifier
)以识别代码并将其用于生成PackID
和序列使用Identity
列
CREATE TABLE [dbo].[tblPacks]
(
Iden_ID INT IDENTITY(1, 1),
[ID] [INT] NOT NULL,
[BatchNumber] [VARCHAR](30) NULL,
[Identifier] [VARCHAR](50),
[PackID] AS [Identifier]
+ CASE
WHEN Iden_ID <= 999 THEN RIGHT('00' + CONVERT(VARCHAR(3), ID), 3)
ELSE CONVERT([VARCHAR](20), ID, 0)
END,
[Status] [INT] NULL
)
检查工作
INSERT INTO [dbo].[tblPacks]
([ID],identifier,[BatchNumber],[Status])
VALUES (1,'pk','bat',1)
SELECT *
FROM [tblPacks]