2012-05-06 119 views
15

我想搜索一个XML值的列来查看a是否包含字符串。我不知道模式,我想知道字符串是否包含在任何地方。我不知道XPATH是否可以在这种情况下工作。使用LIKE或类似的完整搜索操作搜索XML

Select s.Name, ts.ValueXML from table t (nolock) 
join table2 ts (nolock) on t.key_Id = ts.key_Id 
join table3 s (nolock) on ts.key_Id=s.key_Id 
where s.Name like '%Lab%' and ts.ValueXML like '%PreviewDateRange%' 

ERROR: Argument data type xml is invalid for argument 1 of like function.

等效相关ts表列

ValueXml (XML(.), null)

我在寻找应该是一个属性的项目。所以如果上述不可能的话,那么包含该属性的任何东西都是不错的选择。

+0

这应该工作。你能举出一个不起作用的例子吗? – dasblinkenlight

+1

您可以发布表定义,并用您正在使用的RDBMS类型标记问题吗? – dasblinkenlight

回答

35

最简单的(但肯定不是最快的执行)的方式将它传递给like之前将您的列转换为nvarchar(max)

cast(ValueXml as nvarchar(max)) like '%PreviewDateRange%' 
+0

这是一个非生产,一次性查询。性能并不重要。我尝试了这一点,并得到错误:从XML的一个或多个字符转换为目标排序规则不可能 –

+1

@ P.Brian.Mackey它应该做的伎俩然后 - 我尝试了['sqlfiddle'](http://sqlfiddle.com /#!3/742c5/3),并且它工作正常。 – dasblinkenlight

+0

编辑需要散文反应提到铸varchar和代码提到nvarchar。 Varchar很好,但如果遇到排序规则转换,可以使用nvarchar - 那是我需要的部分。 – MattH

2

你去那里:

SELECT * 
FROM MyTable 
WHERE MyXmlMetadataColumn.exist('//*/text()[contains(upper-case(.),upper-case("MySearchTerm"))]') = 1 

这似乎为我工作得很好,也不会搜索XML标签名称作为“dasblinkenlight”提供的解决方案。

我不知道它是如何执行的。