SQL:插入期间自动递增值
Posted
技术标签:
【中文标题】SQL:插入期间自动递增值【英文标题】:SQL: Auto Increment value during insert 【发布时间】:2012-02-02 16:18:51 【问题描述】:我有一个现有的表,由于某种原因,设计人员决定通过将最后使用的值存储在单独的表中来手动控制主键值(现在不能选择将表更改为使用 Identity)。
我现在需要对该表进行大规模更新,如下所示:
DECLARE @NeedFieldID int
SET @NeedFieldID = 62034
INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale)
(
SELECT
DISTINCT n.NeedID,
@NeedFieldID + 1,
'DetailedOutcome',
999,
'Detailed Outcome',
'Select appropriate reason for a No Sale outcome',
'T',
'Pricing, Appointment Date / Time Not Available, Will Call Back, Declined',
0
FROM T_L_Need n
INNER JOIN T_L_NeedField nf
ON n.NeedID = nf.NeedID
WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0)
)
显然 '@NeedFieldID + 1' 不起作用(只是用它来显示我想做什么)。当 SQL 为每个不同的 NeedId 插入值时,如何增加 @NeedFieldID?我使用的是 SQL Server 2008。
【问题讨论】:
【参考方案1】:你想要row_number()
:
DECLARE @NeedFieldID int
SET @NeedFieldID = 62034
INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale)
(
SELECT
DISTINCT n.NeedID,
@NeedFieldID + row_number() over (order by n.NeedID),
'DetailedOutcome',
999,
'Detailed Outcome',
'Select appropriate reason for a No Sale outcome',
'T',
'Pricing, Appointment Date / Time Not Available, Will Call Back, Declined',
0
FROM T_L_Need n
INNER JOIN T_L_NeedField nf
ON n.NeedID = nf.NeedID
WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0)
)
但是,最好的办法是让NeedFieldID
成为标识列,让 SQL Server 为您完成工作。
【讨论】:
以上是关于SQL:插入期间自动递增值的主要内容,如果未能解决你的问题,请参考以下文章
Azure 逻辑应用 - MySQL 连接器 - 根据需要插入显示自动递增主键字段的行操作