sql - 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
我可以提供更多信息吗?还是以不同的格式?非常感谢!
解决方案
这是所提出问题的一种解决方案。但是,我使用“光标”,这是我试图避免的。我会对 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
推荐阅读
- powershell - 更改 Internet 属性中 LAN 设置的自动检测设置和自动配置脚本时,指定的强制转换无效 Powershell
- python - openai健身房观察空间表示
- python - torch.Linear weight 不更新
- python - 使用 BeautifulSoup 从多个页面下载多线程文件的 Web 抓取
- android - Firestore startAt 跳过给它的快照并改为 startAfter
- python - 两个机器人之间的通信?(discord.py)
- java - spring integration(5.3.2)如何支持分布式环境下多节点集群?
- linux - Linux (psql) 不会列出所有数据库,但 pgadmin 会列出
- r - 使用赋值运算符和字符串列名更新数据表列的值不起作用
- c# - WPF 错误:调用线程无法访问此对象,因为不同的线程拥有它