SQL查询来自varchar(max)列的xml数据

时间:2017-05-02 15:10:33

标签: sql-server xml sql-server-2008-r2 xquery

我有一个名为Content的表,其中varchar(max)列名为data

此列中的数据采用XML格式,我想查询XML中的属性。

下面是XML的前几行,它是我要查询的p3:manifestId,所以我的输出基本上是Some_Data(我显然已经对它敏感了)。

这可能吗?

<manifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.w3.org/2001/XMLSchema-instance" 
      p3:manifestDateTime="2016-02-17T17:34:29.5925096Z" 
      p3:manifestVersion="1.1" p3:manifestId="Some_Data">
  <p3:productList>
    <p3:product p3:releaseDateTime="2016-02-17T17:34:29.5925096Z"         p3:installSeqId="2" p3:uninstallSeqId="2" p3:releaseNum="1" p3:productType="doc" p3:productId="WEDREZ020RRRP0GGG001" p3:mfgCode="GIRE">

1 个答案:

答案 0 :(得分:1)

这里唯一可能复杂的是命名空间。这个XML是如何生成的?看到相同的命名空间(http://www.w3.org/2001/XMLSchema-instance)是默认的并且有两个不同的别名......

是很不寻常的
DECLARE @mockup TABLE(ID INT IDENTITY, YourXML VARCHAR(MAX));

INSERT INTO @mockup VALUES
('<manifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns="http://www.w3.org/2001/XMLSchema-instance" 
          p3:manifestDateTime="2016-02-17T17:34:29.5925096Z" 
          p3:manifestVersion="1.1" p3:manifestId="Some_Data">
   <!--Some more stuff-->
   </manifest>');

- 这种方法根本不考虑名称空间。我使用通配符*:

SELECT CAST(YourXML AS XML).value(N'(/*:manifest/@*:manifestId)[1]',N'nvarchar(max)')
FROM @mockup;

- 此方法提前声明所有需要的命名空间(在大多数情况下是最佳方法):

WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2001/XMLSchema-instance'
                          ,'http://www.w3.org/2001/XMLSchema-instance' AS p3)
SELECT CAST(YourXML AS XML).value(N'(/manifest/@p3:manifestId)[1]',N'nvarchar(max)')
FROM @mockup;

- 如果您真的不需要多个值,这种方法很有用。我对此命名空间的所有不同出现使用了一个别名ns1

SELECT CAST(YourXML AS XML).value(N'declare namespace ns1="http://www.w3.org/2001/XMLSchema-instance";
                                    (/ns1:manifest/@ns1:manifestId)[1]',N'nvarchar(max)')
FROM @mockup;