2016-08-31 4 views
1

Ich habe eine gespeicherte Prozedur wie folgt:Kann nicht komplexe XML-Datei in SQL Server-Tabelle einfügen

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

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

    SET @XmlString = 
    '<ArrayOfSizeColorQuantityViewModel> 
     <ProductId></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 

Und ich versuche, diese komplexen XML-Daten an unten stehenden Tabelle einzufügen:

Tabelle: (3 Fremdschlüssel)

enter image description here

ich weiß nicht, ob ich irgendein Problem mit Parse XML-Code oder nicht? Wenn es dir nichts ausmacht, könntest du mir bitte helfen, es herauszufinden?

Vielen Dank für Art helfen

+1

Side Hinweis: Sie sollten ** nicht ** verwenden, um den 'sp_' Präfix für gespeicherte Prozeduren. Microsoft hat [dieses Präfix für seine eigene Verwendung reserviert (siehe * Gespeicherte Prozeduren benennen *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), und Sie riskieren irgendwann in der Zukunft einen Namenskonflikt. [Es ist auch schlecht für die Leistung Ihrer gespeicherten Prozedur] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Es ist am besten, einfach 'sp_' zu vermeiden und etwas anderes als Präfix zu verwenden - oder gar kein Präfix! –

+0

@marc_s OMG. Ich werde es sorgfältig lesen –

Antwort

1

diesen Code Versuchen:

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) 

Ich entfernte nur eine führende / von Ihrem zweiten XPath (im CROSS APPLY), und ich verlängert auch die Länge des ColorId Wert varchar(4) (damit "blau" korrekt angezeigt wird).

Jetzt erhalte ich diese Ausgabe von den SELECT:

enter image description here

+0

Es funktioniert wie ein Charme. Danke für Ihre freundliche Hilfe: D –