2016-08-31 146 views
1

我有一個存儲過程如下圖所示:無法插入複雜的XML文件導入到SQL Server表

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 

我嘗試插入這個複雜的XML數據見下表:

表: (3個外鍵)

enter image description here

我不知道我是否有解析XML代碼有任何問題嗎? 如果你不介意你能幫我找出答案嗎?

感謝樣幫助

+1

旁註:你應該** **不使用'sp_'前綴爲您的存儲過程。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並使用別的東西作爲前綴 - 或者根本沒有前綴! –

+0

@marc_s OMG。我會仔細閱讀它 –

回答

1

試試這個代碼:

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) 

我只是刪除從您的第二個XPath的領先/(在CROSS APPLY),我也延長了ColorId值的長度varchar(4)(允許「藍色」正確顯示)。

現在,我得到這個輸出從SELECT

enter image description here

+0

它像一個魅力。感謝您的熱心幫助:D –