我有一个将返回的查询和一个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'
我想在这里做的是检查Query返回是否包含我要查找的值。让我们说页面标题="你好世界"
我在下面尝试过。但是它会返回许多空行并且有一行正确的行
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行)
答案 0 :(得分:2)
首先:NTEXT
,TEXT
和IMAGE
已弃用几个世纪,未来的版本将不再受支持!尽快摆脱这种类型!
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);
答案 1 :(得分:1)
演示XQuery表达式https://docs.microsoft.com/en-us/sql/xquery/xquery-language-reference-sql-server以过滤数据
function playAgain(){ // just another function to reset the game
y=confirm("PLAY AGAIN?");
if(y==true){
location.reload(true);
}else{
alert('Good Bye Then!!');
}
}