Debería poder hacer esto con bastante facilidad:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
El .value
método le da el valor real y puede definir que se devuelva como VARCHAR (), que luego puede verificar con una declaración LIKE.
Eso sí, esto no va a ser demasiado rápido. Entonces, si tiene ciertos campos en su XML que necesita inspeccionar mucho, podría:
- cree una función almacenada que obtenga el XML y devuelva el valor que está buscando como VARCHAR ()
- defina un nuevo campo calculado en su tabla que llame a esta función y conviértalo en una columna PERSISTED
Con esto, básicamente "extraerías" una cierta porción del XML en un campo calculado, harías que persistiera, y luego podrás buscar de manera muy eficiente en él (diablos: ¡incluso puedes INDEX ese campo!).
Bagazo
Otra opción más es convertir el XML como nvarchar y luego buscar la cadena dada como si el XML fuera un campo nvarchar.
SELECT * FROM Table WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
Me encanta esta solución porque es limpia, fácil de recordar, difícil de estropear y se puede utilizar como parte de una cláusula where.
EDITAR: Como lo menciona Cliff, podría usar:
fuente
Otra opción es buscar el XML como una cadena convirtiéndolo en una cadena y luego usando LIKE. Sin embargo, como una columna calculada no puede ser parte de una cláusula WHERE, debe envolverla en otro SELECT como este:
SELECT * FROM (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x WHERE [XMLDataString] like '%Test%'
fuente
Esto es lo que voy a usar según la respuesta de 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
Devuelve una subcadena en la búsqueda donde existe el criterio de búsqueda
fuente