首页 > 解决方案 > SQL Server 2017 嵌套插入或在另一插入中使用一个插入的结果

问题描述

我的问题可以用以下人为的例子来概括。我有几张桌子:

AUTOMOBILE
AutoId Make Model Color

BATCH
BatchId SaleDate

INVENTORY
InventoryId AutoId BatchId CustomerName(string) ParkingSlipId

PARKING
ParkingSlipId SlipStatus(String)

目前,INVENTORY 表或 BATCH 表中没有行。我想通过 SQL Server Management Studio 中的查询或存储过程在 INVENTORY 中创建一些假数据。为此,我将简单地获取 AUTOMOBILE 表的前 10 行,并将 AUTOMOBILE 中的 AutoId 用作 INVENTORY.AutoId。我还需要在 BATCH 中为 INVENTORY 中的每个条目创建一个新行。我将使用 BATCH.BatchId 作为 INVENTORY.BatchId。CustomerName 现在可以只是单词“Fred”。对于 ParkingSlipId,我可以从 PARKING 中取出 SlipStatus 为“Empty”的任何行,并使用该 ParkingSlipId 并将状态更改为“Full”。

我已经解决了这个问题,但成功有限。例如,我可以使用类似的东西:

INSERT  [BATCH] 
VALUES (GETDATE())   
DECLARE @tempLoadBatchId bigint
 SELECT @tempLoadBatchId = @@IDENTITY

我可以在下一次插入中使用 tempLoadBatchId(进入库存)

    INSERT  [INVENTORY] (AutoId BatchId CustomerName ParkingSlipId)
VALUES (3,  @tempLoadBatchId, "Fred",77);

UPDATE [PARKING] set SlipStatus= 'FullBoat' where SlipId = 77

请注意,这只是一行,我只是硬编码了 AutoId。

我想自动化这个。使用游标似乎是一种方法,这当然是一种选择(这些表很小,性能不会成为问题),但我也想知道如何在没有游标的情况下做到这一点。谢谢,戴夫

更多背景和期望的结果 作为对评论的回应,我添加了更多信息。如果有用,我可以备份和附加整个数据库。我认为 StackOverflow 会允许这样做。

这是当前的 AUTO 表

AutoId  Make    Model   Colour
1   Ford    Taurus  White
2   GM  Cadilac Silver
3   Toyota  Prius   Blue
4   Honda   Pilot   Green
5   Kia Sonata  Yellow

这是当前的停车位

ParkingSlipId SlipStatus 1 Empty
2 Empty
3 Empty
4 Empty
5 Empty
6 Empty
7 Empty
8 Empty

对于 AUTO 中的每一行,我想在 BATCH 中创建一个新条目,然后使用该 BatchId 创建一个新的 INVENTORY 条目。在那个新的 INVENTORY 条目中,我想使用 AUTO 中的行并分配一个parkingId,并将 PARKING 中的相应parkingid 更改为 FULL。完成所有这些后,表 BATCH、INVENTORY 和 PARKING 应如下所示:

PARKING
ParkingSlipId   SlipStatus
 1  Full      
2   Full      
3   Full      
4   Full      
5   Full      
6   Empty     
7   Empty     
8   Empty     

BATCH
BatchId SaleDate
  1 2018-09-15 00:00:00.000
2   2018-08-20 00:00:00.000
3   2018-06-22 00:00:00.000
4   2018-09-12 00:00:00.000
5   2018-07-01 00:00:00.000


INVENTORY
InventoryId AutoId  BatchId ParkingId   CustomerName
1   1   1   1   Fred
2   2   2   2   Mary
3   3   3   3   Fred
4   4   4   4   Ted
5   5   5   5   James

我可以提供更多信息吗?还是以不同的格式?非常感谢!

标签: sqlsql-serverselectstored-proceduressql-insert

解决方案


这是所提出问题的一种解决方案。但是,我使用“光标”,这是我试图避免的。我会对 Xedni 建议的基于集合的操作感兴趣

    /****** Script  ******/

DECLARE @tempLoadBatchId bigint
DECLARE @tempAutoId int
DECLARE @tempParkingId int
DECLARE @counter bigint
SET @counter = 0

--- AUTOMOBILE STUFF
DECLARE cur CURSOR FOR 
SELECT AutoId
FROM [CarExample].[dbo].[AUTOMOBILE] 

OPEN cur
FETCH NEXT FROM cur INTO @tempAutoId

--- PARKING stuff
DECLARE curParking CURSOR FOR 
SELECT ParkingSlipId
FROM [CarExample].[dbo].[PARKING] where SlipStatus = 'Empty' 

OPEN curParking
FETCH NEXT FROM curParking INTO @tempParkingId
-----
WHILE @counter < 10
BEGIN
    INSERT  [CarExample].[dbo].[BATCH] 
     VALUES (GETDATE())   
    SELECT @tempLoadBatchId = @@IDENTITY

    INSERT  CarExample.[dbo].INVENTORY (AutoId, BatchId, ParkingId, CustomerName)
VALUES (@tempAutoId, @tempLoadBatchId, @tempParkingId, 'Sally');
    SET @counter = @counter + 1

UPDATE [CarExample].[dbo].[PARKING] Set SlipStatus = 'Full' where ParkingSlipId = @tempParkingId
FETCH NEXT FROM cur INTO @tempAutoId 
FETCH NEXT FROM curParking INTO @tempParkingId
END

CLOSE cur
DEALLOCATE cur
CLOSE curParking
DEALLOCATE curParking

推荐阅读