我有一个名为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">
答案 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;