SQL Server:如何获取指定属性的XML元素的值?

时间:2016-04-28 08:04:18

标签: sql sql-server xml tsql xquery-sql

对于SQL查询中的用法,我需要获取特定XML元素的值。 XML元素由其属性指定。

我的XML元素如下所示:

<translations>
  <value lang="en-US">example</value>
  <value lang="de-DE">Beispiel</value>
</translations>

当我指定lang为“en-US”时,我正在寻找的值将是“example”。

我找到了一种方法来使用query()函数和之后的value()函数来获取此值。

declare @S varchar(max)

set @S =
'<translations>
  <value lang="en-US">example</value>
  <value lang="de-DE">Beispiel</value>
</translations>'

declare @X xml

set @X = CAST(@S as xml)

select @X.query('/translations/value[@lang="en-US"]').value('.','varchar(max)')

这个select语句通过使用query()和value()函数返回我要查找的值“example”。但是还有一种 - 更方便 - 只使用value()OR query()的方法吗?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

当然有......

您还可以缩短声明:

declare @X xml=
'<translations>
  <value lang="en-US">example</value>
  <value lang="de-DE">Beispiel</value>
</translations>';

select @X.value('(/translations/value[@lang="en-US"])[1]','varchar(max)');

关键是,当您使用.value()时,您需要单身结果。你可以通过将XPath放在paranthesis中来强制执行第一个元素(在这种情况下它是唯一的元素)。

顺便说一句:如果你需要这个(迟早你需要这个......),你可以将“en-US”作为参数放入你的查询中:

declare @prm VARCHAR(10)='en_US';
select @X.value('(/translations/value[@lang=sql:variable("@prm")])[1]','varchar(max)');

您可以使用sql:column()

来达到相似但具有实际查询的值