Вставить данные XML в таблицу SQL Server - PullRequest
0 голосов
/ 05 августа 2010

Мои данные выглядят так:

<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)            
        )

Когда у меня несколько продуктов / надстроек, все надстройки вставляются сlatest @OrderItemID ... Я не уверен, как работать в моем SQL, который вставляет аддон в цикл, который проходит через узлы продукта.

Может ли кто-нибудь указать мне правильное направление?

спасибо заранее!

1 Ответ

0 голосов
/ 05 августа 2010

Я думаю,

Вам нужно вставить записи в Loop, чтобы получить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...