2012-05-06 11 views
15

Quiero buscar una columna con valores XML para ver si a contiene una cadena. No sé el esquema, quiero saber si la cadena está contenida en alguna parte. No sé si XPATH funcionaría en esta situación.Buscar XML con una operación de búsqueda completa LIKE u otra similar

El equivalente de

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.

columnas ts cuadro pertinente

ValueXml (XML(.), null)

El punto que estoy buscando debe ser un atributo. Entonces, si lo anterior no es posible, cualquier cosa que contenga ese atributo sería una buena alternativa.

+0

Esto debería funcionar. ¿Podría mostrar un ejemplo en el que no funciona? – dasblinkenlight

+1

¿Podría publicar la definición de tabla y etiquetar la pregunta con el tipo de RDBMS que está utilizando? – dasblinkenlight

Respuesta

35

El más simple (pero definitivamente no es el más rápido de ejecutar) forma sería la de emitir su columna para nvarchar(max) antes de pasarla a like:

cast(ValueXml as nvarchar(max)) like '%PreviewDateRange%' 
+0

Esta es una consulta no productiva y única. El rendimiento no importa. Intenté esto y obtuve Error: Conversión de uno o más caracteres de XML a colación de destino imposible –

+1

@ P.Brian.Mackey Debería hacer el truco entonces - Lo probé en ['sqlfiddle'] (http://sqlfiddle.com/#! 3/742c5/3), y funcionó bien. – dasblinkenlight

+0

Se requiere edición ya que la respuesta en prosa menciona varchar y el código menciona nvarchar. Varchar está bien, pero si se encuentra una conversión de clasificación, se puede usar nvarchar, esa era la parte que necesitaba. – MattH

2

ahí lo tienes:

SELECT * 
FROM MyTable 
WHERE MyXmlMetadataColumn.exist('//*/text()[contains(upper-case(.),upper-case("MySearchTerm"))]') = 1 

Esto parece funciona bien para mí y tampoco busca los nombres de las etiquetas XML como la solución provista por "dasblinkenlight".

No sé qué tan eficiente es sin embargo.

Cuestiones relacionadas