Você deve ser capaz de fazer isso facilmente:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
O .value
método fornece o valor real e você pode defini-lo para ser retornado como um VARCHAR (), que você pode verificar com uma instrução LIKE.
Veja bem, isso não vai ser muito rápido. Portanto, se você tiver determinados campos em seu XML que precise inspecionar muito, poderá:
- crie uma função armazenada que obtém o XML e retorna o valor que você está procurando como um VARCHAR ()
- definir um novo campo computado em sua tabela que chama esta função, e torná-lo uma coluna PERSISTED
Com isso, você basicamente "extrairia" uma determinada parte do XML em um campo computado, tornaria-o persistente e, então, poderia pesquisar com muita eficiência (diabos: você pode até INDEXAR esse campo!).
Marc
Outra opção é converter o XML como nvarchar e, em seguida, pesquisar a string fornecida como se o XML fosse um campo nvarchar.
SELECT * FROM Table WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
Adoro esta solução porque é limpa, fácil de lembrar, difícil de bagunçar e pode ser usada como parte de uma cláusula where.
EDIT: Como Cliff menciona, você pode usar:
fonte
Outra opção é pesquisar o XML como string, convertendo-o em string e usando LIKE. No entanto, como uma coluna computada não pode fazer parte de uma cláusula WHERE, você precisa envolvê-la em outro SELECT como este:
SELECT * FROM (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x WHERE [XMLDataString] like '%Test%'
fonte
Isso é o que vou usar com base na resposta 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
Retorna uma substring na pesquisa onde os critérios de pesquisa existem
fonte