插入前了解身份

时间:2018-09-19 18:05:06

标签: sql sql-server

我想从表本身中复制表中的行。但是在插入之前,我需要修改varchar列,并将identity列的值附加到它后面。 我的表结构是:

secID docID secName secType secBor
 1     5     sec-1   G        9
 2     5     sec-2   H        12
 3     5     sec-3   G        12
 4     7     sec-4   G        12
 5     7     sec-5   H        9

如果我要复制docID 5的数据,则当前每次循环运行一行。

我可以将查询写为

insert into tableA (docID, secName, secType, secBor)
select 8, secName, secType, secBor from tableA where docID = 5

但是如何预先设置secName的值,使其变为sec-<value of secID column>

4 个答案:

答案 0 :(得分:2)

不要尝试猜测身份列的值。在您的情况下,您可以简单地创建一个计算列secName AS CONCAT('sec-', secID)。不再需要更新该列。

DB Fiddle

还可以创建一个AFTER INSERT触发器来更新该列。

答案 1 :(得分:0)

在我的评论中添加以下内容:

[: : integer expression expected

答案 2 :(得分:0)

在SQL Server 2012及更高版本中,您可以使用新的sequence object来实现。

CREATE SEQUENCE TableAIdentitySeqeunce
START WITH 1  
INCREMENT BY 1 ;  

GO

create table TableA 
(
    secId int default (NEXT VALUE FOR TableAIdentitySeqeunce) not null primary key,
    varcharCol nvarchar(50)
)  

declare @nextId int;
select @nextId = NEXT VALUE FOR TableAIdentitySeqeunce

insert TableA (secId, varcharCol) 
values (@nextId, N'Data #' + cast(@nextId as nvarchar(50)))

答案 3 :(得分:0)

由于SQL Server没有GENERATED ALWAYS AS ('Sec - ' + id),所以我看到的唯一简单选择就是使用触发器。