sql - 如何从表列获取xml值

标签 sql sql-server sql-server-2008

<SSRSReport>
  <OutputType>email</OutputType>
  <email>
    <emailTo>xyz.com</emailTo>
    <emailReplyTo>dd@gmail.com</emailReplyTo>
    <emailSubject>status report</emailSubject>
    <emailBody>
</email>
</SSRSReport>

需要您帮助从 xml 类型的一列中现有的表中选择 sql 中的节点值。我已经尝试过的是:

select 
   T.id, 
   T.xml_data.value('(SSRSReport/email/@emailTo)[1]', 'varchar(50)') as PropertyName 
from 
   abc as T 
where 
   T.xml_data.exist('/email/emailTo') = 'xyz.com'

但它返回属性名称列为空。

最佳答案

你已经很接近了 - 但自从 <emailTo>是一个元素(不是属性),您需要使用:

select 
T.id, 
T.xml_data.value('(SSRSReport/email/emailTo)[1]', 'varchar(50)') as PropertyName 

使用/emailTo (不是 /@emailTo )作为 XPath 表达式的最后一部分。

此外,.exist()函数只能检查 XML 元素(或属性)是否存在,因此您可以检查 <emailTo> 是否存在元素存在(或不存在),但无法与值进行比较。所以你的WHERE条款无效 - 您可能想要:

where 
   T.xml_data.value('(SSRSReport/email/emailTo)[1]', 'varchar(50)') = 'xyz.com' 

关于sql - 如何从表列获取xml值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17804636/

相关文章:

c# - 如何从 Windows 应用程序调用 SQL Server 代理中的作业

sql - SQL Server 中不同字符串类型之间的区别?

java - com.microsoft.sqlserver.jdbc.SQLServerException : The TCP/IP connection to the host localhost, 端口 1433 失败

sql - Sql如何只返回所有重复的条目

sql - MySQL加入问题

php - MySQL多表SELECT

c# - 将 LINQ to EF 查询加速到最大

sql - 跟踪 Rails 3 SQL 查询

c# - LINQ to SQL - 数据库设计问题

c# - 根据行号删除多行