node - Utilice una instrucción LIKE en SQL Server XML Datatype
xml to table sql server (4)
Debería poder hacer esto con bastante facilidad:
SELECT *
FROM WebPageContent
WHERE data.value(''(/PageContent/Text)[1]'', ''varchar(100)'') LIKE ''XYZ%''
El método .value
le proporciona el valor real y puede definirlo para que se devuelva como VARCHAR (), que luego puede verificar con una instrucción LIKE.
Eso sí, esto no va a ser muy rápido. Entonces, si tiene ciertos campos en su XML que necesita inspeccionar mucho, podría:
- crea una función almacenada que obtiene el XML y devuelve el valor que estás buscando como VARCHAR ()
- define un nuevo campo calculado en tu tabla que llama a esta función y la convierte en una columna PERSISTED
Con esto, básicamente "extraerías" una cierta porción del XML en un campo calculado, lo harías persistir, y luego puedes buscarlo de manera muy eficiente (diablos: ¡puedes incluso INDICAR ese campo!).
Bagazo
Si tiene un campo varchar, puede hacer SELECT * FROM TABLE WHERE ColumnA LIKE ''%Test%''
para ver si esa columna contiene una determinada cadena.
¿Cómo lo haces para XML Type?
Tengo lo siguiente que devuelve solo las filas que tienen un nodo ''Texto'' pero necesito buscar dentro de ese nodo
select * from WebPageContent where data.exist(''/PageContent/Text'') = 1
Esto es lo que voy a usar basado en 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
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 formar 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%''
Otra opción es convertir 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, ya que es limpia, fácil de recordar, difícil de estropear y se puede utilizar como parte de una cláusula where.
EDITAR: Como Cliff lo menciona, puedes usar:
... nvarchar si hay caracteres que no se convierten a varchar