将XML数据插入SQL Server表

时间:2010-08-05 08:40:44

标签: sql-server sql-server-2005 tsql

我的数据如下所示:

<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将插件插入循环产品节点的循环中。

有人能指出我正确的方向吗?

提前感谢!

1 个答案:

答案 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