SQL查询XML数据

时间:2019-04-03 18:56:25

标签: sql sql-server xml tsql xpath

我有一个SQL Server数据库表,其中的列名为XML,其中包含XML数据,其结构如下:

<Item xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://test/data">
  <Roots>
    <Root>
      <Name>Field Name</Name>
      <Value>Field Value</Value>
    </Root>
    <Root>
      <Name>Field Name</Name>
      <Value>Field Value</Value>
    </Root>
</Roots>

我想使用T-SQL来获得Value,其中Name = Total。我已经尝试了以下方法,但是它没有返回任何数据:

SELECT [XML]
FROM [BusinessAccount]
WHERE [XML].value('(/Root/Name)[13]', 'VARCHAR(MAX)') LIKE '%Total%'

如果有人可以告诉我我哪里出问题了?

2 个答案:

答案 0 :(得分:2)

您缺少XML必需的Matrix operator+(const T &a) { Matrix<row, col, T> result; for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { result.elements[i][j] = elements[i][j] + a; } } return result; } ,并且路径不正确。

如果您想返回第13个元素由文本WITH XMLNAMESPACES组成的行,则可以使用以下内容。

Total

否则,您可以将WITH XMLNAMESPACES (DEFAULT 'http://test/data') SELECT [XML] FROM [BusinessAccount] WHERE 1 = [XML].exist('(/Item/Roots/Root/Name)[13][text() = "Total"]') 添加到原始查询中,并在那里也修复路径。

答案 1 :(得分:1)

您需要指定名称空间。然后,您可以匹配<Name><Value>对,并提取<Value>的内容,如下所示:

SELECT NameNode.value('declare namespace x="http://test/data"; (../x:Value)[1]', 'varchar(100)')
FROM [BusinessAccount]
CROSS APPLY [XML].nodes('declare namespace x="http://test/data"; //x:Root/x:Name') AS n(NameNode)
WHERE NameNode.value('.', 'varchar(100)') = 'Total'

Demo on db<>fiddle