插入后的T-SQL增量ID

时间:2017-04-20 12:21:37

标签: sql-server tsql stored-procedures

我目前正在使用T-SQL在SQL Server 2012中处理存储过程。我的问题:我有几个SWOT(例如针对特定客户)持有几个SWOTParts(优势,劣势,机会和威胁)。我将值存储在表格 Swot 以及另一个表格 SwotPart 中。

我的外键链接是SwotPart中的SwotId,因此1个Swot可以容纳N个SwotPart。因此,我将SwotId存储在每个SwotPart中。

我可以有很多Swots,现在需要正确设置SwotId来创建外键。我使用SCOPE_IDENTITY()设置了SwotId,遗憾的是它只需要DB中的最后一个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()

非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以output inserted行进入临时表,然后根据自然键将@swotparts加入临时表(无论唯一列集合在一起超出SwotId {1}})。这将解决使用循环或游标的问题,同时还克服了一次执行单个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;

答案 1 :(得分:0)

不幸的是我不能发表评论所以我会给你一个答案,希望澄清一些事情:

  • 因为你需要创建正确的外键我不明白 为什么需要增加值而不是使用插入的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