1

I have a stored procedure like below:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Sp_ComplexXml]
AS
BEGIN
    DECLARE @XmlString xml

    SET @XmlString = 
    '<ArrayOfSizeColorQuantityViewModel>
      <ProductId>012312</ProductId>
      <SizeColorQuantityViewModel>
        <ColorId>Red</ColorId>
        <SizeAndQuantities>
          <SizeAndQuantity>
            <SizeId>S</SizeId>
            <Quantity>1</Quantity>
          </SizeAndQuantity>
          <SizeAndQuantity>
            <SizeId>M</SizeId>
            <Quantity>2</Quantity>
          </SizeAndQuantity>
          <SizeAndQuantity>
            <SizeId>L</SizeId>
            <Quantity>3</Quantity>
          </SizeAndQuantity>
          <SizeAndQuantity>
            <SizeId>XL</SizeId>
            <Quantity>4</Quantity>
          </SizeAndQuantity>
        </SizeAndQuantities>
      </SizeColorQuantityViewModel>

      <SizeColorQuantityViewModel>
        <ColorId>Blue</ColorId>
        <SizeAndQuantities>
          <SizeAndQuantity>
            <SizeId>S</SizeId>
            <Quantity>1</Quantity>
          </SizeAndQuantity>
          <SizeAndQuantity>
            <SizeId>M</SizeId>
            <Quantity>2</Quantity>
          </SizeAndQuantity>
          <SizeAndQuantity>
            <SizeId>L</SizeId>
            <Quantity>3</Quantity>
          </SizeAndQuantity>
          <SizeAndQuantity>
            <SizeId>XL</SizeId>
            <Quantity>4</Quantity>
          </SizeAndQuantity>
        </SizeAndQuantities>
      </SizeColorQuantityViewModel>
    </ArrayOfSizeColorQuantityViewModel>'

    INSERT INTO ProductSizeColor(ProductID, SizeID, ColorID, Quantity)
        SELECT
            SCQ.node.value('(../ProductId)[1]', 'bigint') as 'ProductID',
            SCQ.node.value('(ColorId)[1]', 'varchar(3)') as 'ColorID',
            SQ.i.value('(SizeId)[1]', 'varchar(3)') as 'SizeID',
            SQ.i.value('(Quantity)[1]', 'int') as 'Quantity'
        FROM
            @XmlString.nodes('/ArrayOfSizeColorQuantityViewModel/SizeColorQuantityViewModel') as SCQ(node)
        CROSS APPLY 
            SCQ.node.nodes('/SizeAndQuantities/SizeAndQuantity') as SQ(i)
END

And I try to insert this complex XML data to table below:

Table: (3 foreign keys)

enter image description here

I don't know whether I have any problem with parse XML code or not? If you don't mind could you please help me find it out?

Thanks for kind helping

2

1 Answer 1

1

Try this code:

SELECT
    SCQ.node.value('(../ProductId)[1]', 'bigint') as 'ProductID',
    SCQ.node.value('(ColorId)[1]', 'varchar(4)') as 'ColorID',
    SQ.i.value('(SizeId)[1]', 'varchar(3)') as 'SizeID',
    SQ.i.value('(Quantity)[1]', 'int') as 'Quantity'
FROM
    @XmlString.nodes('/ArrayOfSizeColorQuantityViewModel/SizeColorQuantityViewModel') as SCQ(node)
CROSS APPLY 
    SCQ.node.nodes('SizeAndQuantities/SizeAndQuantity') as SQ(i)

I just removed a leading / from your second XPath (in the CROSS APPLY), and I also extended the length of the ColorId value to varchar(4) (to allow for "blue" to be shown properly).

Now I get this output from the SELECT:

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

It works like a charm. Thanks for your kind helping :D

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.