使用与INSERT一起使用的逻辑替换计算列

时间:2016-12-22 16:29:43

标签: sql sql-server sql-server-2008

我有一张名为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..)序列,而不管@IDID。不能是身份列。我怎样才能做到这一点? 实际上这个PackID是条形码如果条形码已经存在于Pack中,那么该序列可能与我们使用的序列不同,我们生成的新生成的条形码将在序列PK001中 样本输出: -

ID BatchNumber PackID     Status
 1    b1           PK001    0
 1    b2           Pk002    0
 5    b7           ABC768   0
 3    b2           PK003    0

1 个答案:

答案 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] 
相关问题