SQL 服务器:如何获取指定属性的 XML 元素的值?
SQL Server: How to get the value of a XML element specifying an attribute?
为了在 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 语句 return 我正在使用 query() 和 value() 函数查找的值 "example"。但是是否还有更方便的方法来仅使用 value() 或 query()?
提前致谢!
当然有...
您也可以缩短声明:
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
放在括号中并强制采用第一个元素来实现此目的(在本例中它是唯一的元素)。
顺便说一句:如果你需要这个(迟早你会需要这个......),你可以将 "en-US" 作为参数放入你的查询中,如下所示:
declare @prm VARCHAR(10)='en_US';
select @X.value('(/translations/value[@lang=sql:variable("@prm")])[1]','varchar(max)');
您可以通过使用 sql:column()
.
达到类似的,但具有实际查询的值
为了在 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 语句 return 我正在使用 query() 和 value() 函数查找的值 "example"。但是是否还有更方便的方法来仅使用 value() 或 query()?
提前致谢!
当然有...
您也可以缩短声明:
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
放在括号中并强制采用第一个元素来实现此目的(在本例中它是唯一的元素)。
顺便说一句:如果你需要这个(迟早你会需要这个......),你可以将 "en-US" 作为参数放入你的查询中,如下所示:
declare @prm VARCHAR(10)='en_US';
select @X.value('(/translations/value[@lang=sql:variable("@prm")])[1]','varchar(max)');
您可以通过使用 sql:column()
.