我的问题可以用以下设计的例子来概括。我有几张桌子:
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
我可以提供更多信息吗?还是以不同的格式?非常感谢!
这是提出问题的一种解决方案。但是,我使用“光标”,这是我试图避免的。我对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