SQL Server 2017嵌套在另一个插入中插入或使用一个插入的结果

问题描述 投票:-2回答:1

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

AUTOMOBILE
AutoId Make Model Color

BATCH
BatchId SaleDate

INVENTORY
InventoryId AutoId BatchId CustomerName(string) ParkingSlipId

PARKING
ParkingSlipId SlipStatus(String)

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

我玩这个问题的成功有限。我可以使用例如:

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

我可以在我的下一个插入中使用tempLoadBatchId(进入INVENTORY)

    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空 2空 3空 4空 5空 6空 7空 8空

对于AUTO中的每一行,我想在BATCH中创建一个新条目,然后使用该BatchId创建一个新的INVENTORY条目。在新的INVENTORY条目中,我想使用AUTO中的行并指定parkingId并在PARKING TO FULL中更改相应的parkingid。完成所有这些后,表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

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

sql sql-server select stored-procedures sql-insert
1个回答
0
投票

这是提出问题的一种解决方案。但是,我使用“光标”,这是我试图避免的。我对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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.