INSERT语句中的计算列

时间:2016-12-22 05:27:23

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

创建了一个表:

CREATE TABLE [dbo].[tblPacks]
(
    [ID] [int] NOT NULL,
    [BatchNumber] [varchar](30) NULL,
    [PackID] AS (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)) PERSISTED,
    [Status] [int] NULL
)

现在我有一个新的要求,除了这个序列之外,还可以添加到此表中,以便我将删除计算逻辑并创建表格为:

 CREATE TABLE [dbo].[tblPacks]
    (
        [ID] [int] NOT NULL,
        [BatchNumber] [varchar](30) NULL,
        [PackID] VARCHAR(50),
        [Status] [int] NULL
    )

现在我想要两个'PackID'应该具有与此类似的逻辑的插入语句:

  AS (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)) 

没有逻辑的普通插入语句我该怎么做?

2 个答案:

答案 0 :(得分:1)

由于您的ID列不是标识列,因此您只需将计算列中的语句与您的ID值一起使用(为了更好的可读性,我假设您的ID值有一个参数@ID): / p>

INSERT INTO tblPacks (ID, PackID)
VALUES (
    @ID,
    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)
)

如果您的ID列实际上 是一个标识列,则需要SCOPE_IDENTITY()来获取您插入的ID值。但是,由于SCOPE_IDENTITY()仅在之后为您提供了ID ,因此您需要执行两个步骤。对这些步骤使用事务来使您的操作成为原子是个好主意:

BEGIN TRAN

INSERT INTO tblPacks (ID) VALUES (@ID)

UPDATE tblPacks
SET PackID = CONVERT([varchar](50),'PK'+case when len(SCOPE_IDENTITY())<=(3) then CONVERT([varchar](20),right((0.001)*SCOPE_IDENTITY(),(3)),0) else CONVERT([varchar](20),SCOPE_IDENTITY(),0) end,0)
WHERE ID = SCOPE_IDENTITY()

COMMIT

您还可以在表上使用触发器,而不是在未设置值的情况下设置值的计算列:

CREATE TRIGGER TR_tblPacks ON tblPacks
AFTER INSERT
AS
    UPDATE tblPacks
    SET PackID = CONVERT([varchar](50),'PK'+case when len(inserted.ID)<=(3) then CONVERT([varchar](20),right((0.001)*inserted.ID,(3)),0) else CONVERT([varchar](20),inserted.ID,0) end,0)
    FROM inserted
    WHERE tblPacks.ID = inserted.ID AND tblPacks.PackID IS NULL

使用此触发器,您只需将自定义值添加到INSERT语句中即可。如果你没有,触发器将设置默认值。

答案 1 :(得分:0)

您可以将用户定义的函数设置为计算列。就像这样..

{{1}}

然后,您可以在该用户定义的函数中包含此计算列的所有逻辑。