从包含 XML 的 sql 列中提取值

Posted

技术标签:

【中文标题】从包含 XML 的 sql 列中提取值【英文标题】:Extract value from a sql column that contains XML 【发布时间】:2015-08-03 23:28:03 【问题描述】:

我正在尝试从包含 XML 的 SQL Server 表中的列中获取值,但该列的类型不是XML,而是TEXT

我试过了:

SELECT 
    [Id],
    [Request]
FROM 
    [Tracker] 
WHERE 
    [Request].value('/Credit[1]/Loan[1]/LoanApp[1]/Applicant[1]/Personal[1]/Individals[1]/Individual[1]/GivenName[1]/FirstName[1]', 'nvarchar(50)') = 'Tom'

但我收到此错误:

找不到“Request”列或用户定义的函数或聚合“Request.value”,或者名称不明确。

我尝试像这样投射列:

select  
    CAST(CAST(Request AS NTEXT) AS XML).value('(/Credit[1]/Loan[1]/LoanApp[1]/Applicant[1]/Personal[1]/Individuals[1]/Individual[1]/GivenName[1]/FirstName[1]', 'nvarchar(50)') 
from Tracker

但是我得到了这个错误:

XML 解析:第 1 行,第 15 个字符,应为字符串文字

我尝试了此链接中的解决方案: Unable to cast TEXT to XML in SQL Server

  XML parsing: line 1, character 15, A string literal was expected

这是我尝试过的:

 SELECT 
  CAST(
  REPLACE(CAST(Request AS VARCHAR(MAX)), 'encoding="utf-16"',   'encoding="utf-8"')
AS     XML).value('(Credit/Loan/App/Applicant/Personal/Individuals/Individual/GivenName/FirstName/text())[1]', 'NVARCHAR(max)') as UserGuid
 FROM Tracker

【问题讨论】:

Unable to cast TEXT to XML in SQL Server的可能重复 【参考方案1】:

你的投射是正确的

select  CAST(CAST(Request AS NTEXT)AS  
   XML).value('(/Credit[1]/Loan[1]/LoanApp[1]/Applicant[1]/Personal[1]/Individuals[1]/Individual[1]/GivenName[1]/FirstName[1]', 'nvarchar(50)') 

from Tracker]

但是您收到错误的可能原因之一是您没有在单引号或双引号中指定属性。

例如,您的 Request 文本字段中有 <credit id=12>,您需要在将其转换为 XML 之前将其更改为 <credit id='12'><credit id="12">

【讨论】:

但我无法更改 XML,它是 100000 条记录,表中带有 XML 的我不应该更改它们,我的代码应该可以使用它。【参考方案2】:

将您的对象投射到String,然后使用XmlTextReaderReadXml

【讨论】:

以上是关于从包含 XML 的 sql 列中提取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 dataReader 列中读取 Xml 值

从 BigQuery 列中提取 Json 值

从具有某些分隔符的 SQL 列中搜索和提取数据

如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)

使用 SQL 或 PL/SQL 解析 XML 文档以提取字段值

Oracle SQL 查询为包含相同 ID 的行提取最大日期的数据