大家好,
这类似于其他命名空间问题(例如 StackOverflow Question ),但我似乎无法让我的查询工作。
我有一堆 XML 文档,我把它们放在 MS SQL Server 中,我需要从中提取数据,但我无法控制它们的格式。由于我认为是多个命名空间,我遇到了麻烦。
这是一个示例。
DECLARE @table TABLE (ID INT NOT NULL, XmlContent XML)
INSERT INTO @table VALUES
(1,
'<PyroSmartDO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="PyroSmartDO_1_1.xsd" Major="0" Minor="0" Build="0" Revision="0">
<Run Name="1-8-12" CreatedBy="user" CreatedDate="2012-08-02T10:39:33" Status="FINISHED" Type="SQA">
<RunInfo>
<WellInfos>
<WellInfo WellNr="H12">
<Sample CreatedDate="2012-08-14T16:44:27.765625+05:30">
<Note>11- 0129</Note>
</Sample>
</WellInfo>
<WellInfo WellNr="H11">
<Sample CreatedDate="2012-08-14T16:44:27.765625+05:30">
<Note>11- 0128</Note>
</Sample>
</WellInfo>
<WellInfo WellNr="H10">
<Sample CreatedDate="2012-08-14T16:44:27.765625+05:30">
<Note>11- 0127</Note>
</Sample>
</WellInfo>
</WellInfos>
</RunInfo>
</Run>
</PyroSmartDO>')
SELECT * FROM @table;
SELECT
Content = XmlContent.value('(/PyroSmartDO/Run/RunInfo/WellInfos/WellInfo/Sample/Note)[1]', 'varchar(50)')
FROM @table
WHERE ID = 1
我是 XML 和 MS SQL Server 的新手,所以其中一些东西对我来说真的很模糊。
xmlns="PyroSmartDO_1_1.xsd"
查询有效。我真的对命名空间感到困惑,似乎无法让查询在那里使用它。 先感谢您 !
最佳答案
由于您对 XML 格式没有任何控制权,因此您可以通过使用以下通配符来掩盖您的命名空间问题:
SELECT Content = XmlContent.value('(//*:Note)[1]', 'varchar(50)')
FROM @table
WHERE ID = 1
但是,您将需要 CROSS APPLY,因为您将需要所有 Note 值而不仅仅是 [1]。
例如:
SELECT Content = T.c.value('.', 'VARCHAR(50)')
FROM @table
CROSS APPLY
XmlContent.nodes('//*:Note') T(c)
关于sql-server - MS SQL-Server 中具有多个 XML 命名空间的 t-sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23252521/