我的数据如下所示:
<products>
<product ProductID="1" Price="79.99" Weight="30.00" Quantity="1">
<addon ProductAddonID="0" ControlTypeID="9" Price="25.00" Weight="0.00" Quantity="1" Name="yyy" Data="ASD" />
<addon ProductAddonID="89" ControlTypeID="0" Price="15.00" Weight="4.00" Quantity="1" Name="xxx" Data="" />
</product>
</products>
我的SQL代码如下所示:
INSERT INTO [Order].Items(OrderID, ProductID, Price, Weight, Quantity)
SELECT @OrderID, ProductID, Price, Weight, Quantity
FROM OPENXML (@XmlHandle, '/products/product',1)
WITH (ProductID INT '@ProductID',
Price DECIMAL(6,2) '@Price',
Weight DECIMAL(6,2) '@Weight',
Quantity INT '@Quantity')
SET @OrderItemId = SCOPE_IDENTITY()
INSERT INTO [Order].Addons(OrderItemID, ProductAddonID, ControlTypeID, Price, Weight, Quantity, [Name], DATA)
SELECT @OrderItemId, ProductAddonID, ControlTypeID, Price, Weight, Quantity, [Name], [Data]
FROM OPENXML(@XMLHandle, '/products/product/addon',1)
WITH (
ProductAddonID INT,
ControlTypeID INT,
Price DECIMAL(6,2),
Weight DECIMAL(6,2),
Quantity INT,
[Name] NVARCHAR(500),
[Data] NVARCHAR(max)
)
当我有多个产品/插件时,所有插件都插入了最新的@OrderItemID ...我不知道如何使用我的SQL将插件插入循环产品节点的循环中。
有人能指出我正确的方向吗?
提前感谢!
答案 0 :(得分:0)
我想,
您需要在循环中插入记录才能获得SCOPE_IDENTITY。
首先放入Order.Items数据临时表,然后在其上循环以插入Order.Items表。
以下是这个想法 - 不工作的代码。
DECLARE @count INT
DECLARE @id INT
SET @count = 1
SET @id = totalNumberOfRecordsInTempTable -- Get records from xml to temp table first
WHILE @count <= @id
BEGIN
INSERT INTO YourTable (Column1, Column2, ...)
SELECT Column1, Column2, ... FROM SourceTable WHERE Id = @count
SET @count = @count + 1
SET @OrderItemId = SCOPE_IDENTITY()
INSERT INTO Order.AddOns
END
我已经检查了它并且在循环中你可以得到SCOPE_IDENTITY。
declare @table table
(
id int,
quanity int
)
insert into @table select 1, 10
insert into @table select 2, 20
insert into @table select 3, 30
insert into @table select 4, 40
declare @table2 table
(
orderid int identity(1, 1),
quanity int
)
declare @id int
select @id = max(id) from @table
while @id > 0
begin
insert into @table2 (quanity)
select quanity from @table where id = @id
set @id = @id - 1
select SCOPE_IDENTITY()
end