2012-05-06 94 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」提供的解決方案。

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