0


0

XMLデータをSQL Serverテーブルに挿入する

私のデータは以下のようになります:


私の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 Answer


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