Powinieneś być w stanie to zrobić dość łatwo:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
.value
Metoda daje rzeczywistą wartość, można określić, które mają być zwracane jako VARCHAR (), które można następnie skontaktować się z oświadczeniem podobne.
Pamiętaj, że to nie będzie strasznie szybkie. Więc jeśli masz pewne pola w swoim kodzie XML, które musisz często sprawdzać, możesz:
- utwórz zapisaną funkcję, która pobiera XML i zwraca wartość, której szukasz jako VARCHAR ()
- zdefiniuj nowe pole obliczeniowe w tabeli, które wywołuje tę funkcję, i uczyń je kolumną PERSISTED
Dzięki temu w zasadzie „wyodrębniłbyś” pewną część XML do pola obliczeniowego, sprawił, że był on utrwalony, a następnie mógłbyś bardzo efektywnie w nim wyszukiwać (do diabła: możesz nawet zindeksować to pole!).
Marc
Jeszcze inną opcją jest rzutowanie XML na nvarchar, a następnie wyszukanie podanego ciągu tak, jakby XML był polem nvarchar.
SELECT * FROM Table WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
Uwielbiam to rozwiązanie, ponieważ jest czyste, łatwe do zapamiętania, trudne do zepsucia i może być używane jako część klauzuli gdzie.
EDYCJA: Jak wspomina Cliff, możesz użyć:
źródło
Inną opcją jest przeszukanie XML jako ciąg znaków, konwertując go na łańcuch, a następnie używając LIKE. Jednak ponieważ kolumna obliczeniowa nie może być częścią klauzuli WHERE, musisz ją opakować w inny element SELECT w następujący sposób:
SELECT * FROM (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x WHERE [XMLDataString] like '%Test%'
źródło
Oto, czego zamierzam użyć na podstawie odpowiedzi marc_s:
SELECT SUBSTRING(DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)'),PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')) - 20,999) FROM WEBPAGECONTENT WHERE COALESCE(PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')),0) > 0
Zwraca podciąg w wyszukiwaniu, w którym istnieją kryteria wyszukiwania
źródło