代码之家  ›  专栏  ›  技术社区  ›  Dave

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

  •  -2
  • Dave  · 技术社区  · 6 年前

    我有几张桌子:

    AUTOMOBILE
    AutoId Make Model Color
    
    BATCH
    BatchId SaleDate
    
    INVENTORY
    InventoryId AutoId BatchId CustomerName(string) ParkingSlipId
    
    PARKING
    ParkingSlipId SlipStatus(String)
    

    当前,INVENTORYtable或BATCH表中没有行。我想用SQLServerManagementStudio中的查询或存储过程在清单中创建一些伪数据。要做到这一点,我只需获取AUTOMOBILE表的前10行并使用AutoId from AUTOMOBILE作为INVENTORY.AutoId. 我还需要为库存中的每个条目创建一个新行。我将使用BATCH.BatchId 作为INVENTORY.BatchId. 客户名称现在可以是“弗雷德”这个词。对于parkingslip,我可以从SlipStatus为“Empty”的parkingslip取任意一行,使用parkingslip并将状态更改为“Full”。

    我一直在处理这个问题,但收效甚微。例如,我可以使用:

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

    我可以在下一次插入(到库存中)时使用templaadbatchid

        INSERT  [INVENTORY] (AutoId BatchId CustomerName ParkingSlipId)
    VALUES (3,  @tempLoadBatchId, "Fred",77);
    
    UPDATE [PARKING] set SlipStatus= 'FullBoat' where SlipId = 77
    

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

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

    作为对评论的回应,我添加了更多的信息。我可以备份和附加整个数据库,如果这是有用的。我想StackOverflow会允许的。

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

    这是现在的停车位

    停车滑行状态 1个空的
    2空
    3空
    4空
    5空

    7空
    8空

    对于AUTO中的每一行,我想在BATCH中创建一个新条目,然后使用BatchId创建一个新的库存条目。在这个新的库存条目中,我想使用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
    

    我能提供更多的信息吗?或者以不同的格式?非常感谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Dave    6 年前

    这里有一个解决这个问题的办法。然而,我使用“光标”,这是我试图避免的。我对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
    
    推荐文章