【问题标题】:SQL Server XML ParsingSQL Server XML 解析
【发布时间】:2016-02-17 10:26:07
【问题描述】:

我在 SQL Server 数据库的 xml 类型列中有一个 XML 块,如下所示:

<p>
  <k>field</k>
  <v>user</v>
</p>
<p>
  <k>action</k>
  <v>delete+set</v>
</p>
<p>
  <k>prompt</k>
  <v>smith</v>
</p>

我无法控制如何将 XML 放入数据库,我只能查询它。

我想编写一个返回“smith”的 select 语句 - v 标记中的值嵌套在一个元素中,该元素包含一个值为“prompt”的 k 元素。

此列名为“apple”,表为“rule”。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 您正在寻找类似 @​​987654323@ 的内容,但这取决于 XML 中的其他内容。
  • FZE - 返回所有值,我只想要一个。
  • ZLK - 这是整个 XML。我不确定 A.B.方法。我已经更新了我的帖子,提到该字段的名称称为“apple”。
  • ZLK 明白了。 SELECT A.B.value('v[1]','NVARCHAR(255)') FROM [rule] CROSS APPLY xml.nodes('/p') A(B) WHERE A.B.value('k[1]','NVARCHAR (255)') = '提示'

标签: sql-server xml


【解决方案1】:

另一种给猫剥皮的方法。

DECLARE @x XML = '<p>
  <k>field</k>
  <v>user</v>
</p>
<p>
  <k>action</k>
  <v>delete+set</v>
</p>
<p>
  <k>prompt</k>
  <v>smith</v>
</p>'

SELECT @X.value('((//k)[text()="prompt"]/../v)[1]', 'varchar(100)')

【讨论】:

  • 这是给猫剥皮的更短的方法:.value('(/p[k="prompt"]/v)[1]', 'varchar(100)')。应该更快,因为没有来回导航。
猜你喜欢
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多