创建了一个表:
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))
没有逻辑的普通插入语句我该怎么做?
答案 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}}
然后,您可以在该用户定义的函数中包含此计算列的所有逻辑。