插入后的 T-SQL 增量 ID
Posted
技术标签:
【中文标题】插入后的 T-SQL 增量 ID【英文标题】:T-SQL Increment Id after Insert 【发布时间】:2017-04-20 12:21:36 【问题描述】:我目前正在使用 T-SQL 在 SQL Server 2012 中处理存储过程。我的问题:我有几个 SWOT(例如,针对特定客户)持有几个 SWOTPart(优势、劣势、机会和威胁)。我将值存储在一个表 Swot 以及另一个表 SwotPart 中。
我的外键链接是 SwotPart 中的 SwotId,因此 1 个 Swot 可以容纳 N 个 SwotPart。因此,我将 SwotId 存储在每个 SwotPart 中。
我可以有很多 Swot,现在需要正确设置 SwotId 来创建外键。我使用 SCOPE_IDENTITY()
设置 SwotId 不幸的是,它只需要数据库中的最后一个 SwotId。我正在寻找类似 for 循环的东西,以便在第一次插入后每次插入后递增 SwotId。
DECLARE @SwotId INT = 1;
-- 1st insert
SET NOCOUNT ON
INSERT INTO [MySchema].[SWOT]([SwotTypeId]) // Type can be e.g. a sepcific client
SELECT SwotTypeId
FROM @SWOTS
SET @SwotId = SCOPE_IDENTITY(); // currently e.g. 7, but should increment: 1, 2, 3...
-- 2nd insert
SET NOCOUNT ON
INSERT INTO [MySchema].[SwotPart]([SwotId], [FieldTypeId], [Label]) // FieldType can be e.g. Streangh
SELECT @SwotId, FieldTypeId, Label
FROM @SWOTPARTS
你知道如何解决这个问题吗?我可以用什么来代替SCOPE_IDENTITY()
?
非常感谢!
【问题讨论】:
当你想插入多个@swots
和@swotparts
时你怎么知道哪个@swotparts
去哪个@swots
?
我看不到您对Swot
表的插入查询,其 id 将用作SwotPart
表中的外键。您不能在外键列中放置任意值。如果我错了,请纠正我。
***.com/questions/34826450/…
【参考方案1】:
您可以将output
和inserted
行添加到临时表中,然后根据自然键将@swotparts
加入到临时表中(无论SwotId
之外的任何唯一列集将它们联系在一起)。这将解决使用循环或游标的问题,同时也克服了一次执行单个swot
的障碍。
set nocount, xact_abort on;
create table #swot (SwotId int, SwotTypeId int);
insert into MySchema.swot (SwotTypeId)
output inserted.SwotId, inserted.SwotTypeId into #swot
select SwotTypeId
from @swots;
insert into MySchema.SwotPart(SwotId, FieldTypeId, Label)
select s.SwotId, p.FieldTypeId, p.Label
from @swotparts p
inner join #swot s
on p.SwotTypeId = p.SwotTypeId;
【讨论】:
谢谢,就像一个魅力!临时表的解决方案是我想要存储 Id @TimHorton 乐于助人!【参考方案2】:很遗憾,我无法发表评论,所以我会给你一个答案,希望能澄清一些事情:
由于您需要创建正确的外键,我不明白 为什么你需要增加一个值而不是使用插入的 id 进入 SWOT 表。我建议在插入语句之后使用 SCOPE_IDENTITY 返回插入的 id,并将其用于插入到 swot 部分(关于它以及如何使用它的信息很多)
DECLARE @SwotId INT;
-- 1st insert
INSERT INTO [MySchema].[SWOT]([SwotTypeId]) // Type can be e.g. a sepcific client
SET @SwotId = SCOPE_IDENTITY();
-- 2nd insert
INSERT INTO [MySchema].[SwotPart]([SwotId], [FieldTypeId], [Label])
SELECT @SwotId, FieldTypeId, Label
FROM @SWOTPARTS
【讨论】:
感谢您的帮助以上是关于插入后的 T-SQL 增量 ID的主要内容,如果未能解决你的问题,请参考以下文章