我目前正在使用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()
?
非常感谢!
答案 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)
不幸的是我不能发表评论所以我会给你一个答案,希望澄清一些事情:
我建议在插入语句后使用 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