Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Can';t将复杂的XML文件插入SQL Server表_Sql Server_Xml - Fatal编程技术网

Sql server Can';t将复杂的XML文件插入SQL Server表

Sql server Can';t将复杂的XML文件插入SQL Server表,sql-server,xml,Sql Server,Xml,我有一个如下所示的存储过程: 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</Product

我有一个如下所示的存储过程:

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
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
改变程序[dbo]。[Sp_ComplexXml]
作为
开始
声明@XmlString xml
SET@XmlString=
"

我不知道我在解析XML代码方面是否有任何问题? 如果你不介意的话,你能帮我找到它吗

感谢您的善意帮助

请尝试以下代码:

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中删除了一个前导的
/
(在
交叉应用中),并且我还将
ColorId
值的长度扩展到
varchar(4)
(以允许正确显示“blue”)

现在,我从
选择中获得此输出:


旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀@我的天啊。我会仔细读的。它很有魅力。谢谢你的帮助:D