SQL返回ntext的列表并将其转换为XML

SQL返回ntext的列表并将其转换为XML,sql,xml,Sql,Xml,我有一个将返回的查询和一个ntext列表,在这些ntext中它们包含XML值。 我的问题是如何将每一个ntext转换为xml并用它进行逻辑处理 查询: select a.content from dbo.content as a inner join dbo.xml_collection_tbl as b on a.xml_fg_id = b.xml_collection_id where a.inherit_from='val1' and b.collection_title='val2'

我有一个将返回的查询和一个ntext列表,在这些ntext中它们包含XML值。 我的问题是如何将每一个ntext转换为xml并用它进行逻辑处理

查询:

select a.content 
from dbo.content as a
inner join dbo.xml_collection_tbl as b on a.xml_fg_id = b.xml_collection_id
where a.inherit_from='val1' and b.collection_title='val2' and a.content_table= 'val3' 
结果:

这里我要做的是检查查询返回是否包含我要查找的值。让我们假设页面标题=hello World

我在下面尝试了。但是它返回了许多空行,并且有一行是正确的

select cast(a.content_html as xml).query('(//root[pagetitle/text()="AAA"])') content_html1
from dbo.content as a
inner join dbo.xml_collection_tbl as b on a.xml_fg_id = b.xml_collection_id
where a.inherit_from='val1' and b.collection_title='val2' and a.content_table= 'val3' 
预期结果是:仅返回一行,其中不是空的行54

XQuery表达式的演示,以筛选数据

with sd as (
    select cast(content_html as xml) as col
    from (
        values 
        ('<root><pagetitle>FFF</pagetitle></root>')
        ,('<root><pagetitle>AAA</pagetitle></root>')
    ) as a(content_html)
)
select t.n.value('.[1]', 'varchar(100)') as content_html1
from sd
cross apply col.nodes('root/pagetitle[text()="AAA"]') t(n)
用于过滤数据的XQuery表达式演示

with sd as (
    select cast(content_html as xml) as col
    from (
        values 
        ('<root><pagetitle>FFF</pagetitle></root>')
        ,('<root><pagetitle>AAA</pagetitle></root>')
    ) as a(content_html)
)
select t.n.value('.[1]', 'varchar(100)') as content_html1
from sd
cross apply col.nodes('root/pagetitle[text()="AAA"]') t(n)
首先:NTEXT、文本和图像已经被弃用了几个世纪,在未来的版本中将不受支持!尽快摆脱这种类型

SQL Server不会将XML存储为您看到的文本,而是存储为层次结构树。这使得XML的处理速度惊人地快,不需要在字符串级别进行解析!。您的方法必须反复解析每个XML,这是一个非常昂贵的操作!将XML的存储更改为原生XML类型,您将对新的性能感到非常满意

如果您必须坚持这一点,您可以这样尝试:

DECLARE @t TABLE (ID INT IDENTITY, YourXML NTEXT);
INSERT INTO @t VALUES('<root><pagetitle>111</pagetitle></root>')
                    ,('<root><pagetitle>aaa</pagetitle></root>')
                    ,('<root><pagetitle>222</pagetitle></root>')
SELECT A.CastedXML
      ,B.pt.query('.')
FROM @t AS t
CROSS APPLY(SELECT CAST(YourXML AS XML) AS CastedXML) AS A
CROSS APPLY A.CastedXML.nodes('/root/pagetitle[text()="aaa"]') AS B(pt);
首先:NTEXT、文本和图像已经被弃用了几个世纪,在未来的版本中将不受支持!尽快摆脱这种类型

SQL Server不会将XML存储为您看到的文本,而是存储为层次结构树。这使得XML的处理速度惊人地快,不需要在字符串级别进行解析!。您的方法必须反复解析每个XML,这是一个非常昂贵的操作!将XML的存储更改为原生XML类型,您将对新的性能感到非常满意

如果您必须坚持这一点,您可以这样尝试:

DECLARE @t TABLE (ID INT IDENTITY, YourXML NTEXT);
INSERT INTO @t VALUES('<root><pagetitle>111</pagetitle></root>')
                    ,('<root><pagetitle>aaa</pagetitle></root>')
                    ,('<root><pagetitle>222</pagetitle></root>')
SELECT A.CastedXML
      ,B.pt.query('.')
FROM @t AS t
CROSS APPLY(SELECT CAST(YourXML AS XML) AS CastedXML) AS A
CROSS APPLY A.CastedXML.nodes('/root/pagetitle[text()="aaa"]') AS B(pt);

将列强制转换为XML并应用XML方法Hi Serg感谢asnwer,但我尝试选择@xmlData=CASTa.content\u html作为XML.query'//root[pagetitle/text=hello World],但是返回了许多空结果。请回答问题并提供示例数据和预期结果。将列强制转换为XML并应用XML方法Hi-Serg感谢asnwer,但我尝试选择@xmlData=CASTa.content\u html作为XML.query'//root[pagetitle/text=hello World],但返回的许多空结果都是问题,并提供了样本数据和预期结果。