2009-07-31 27 views
9

Tengo una tabla que tiene un campo XML. El XML típico que contiene es;Trabajando con el tipo de datos XML de SQL Server

<things> 
    <Fruit> 
    <imageId>39</imageId> 
    <title>Apple</title> 
    </Fruit> 
    <Fruit> 
    <imageId>55</imageId> 
    <title>Pear</title> 
    </Fruit> 
    <Fruit> 
    <imageId>76</imageId> 
    <title>Grape</title> 
    </Fruit> 
</things> 

En mi mesa que tengo alrededor de 50 filas, sólo estoy preocupado por dos campos, Omid (clave principal int) y omText (mis datos XML).

lo que estoy tratando de lograr es una forma de decir, a través de todos los datos XML en toda la mesa ... dame todos los xmlElements donde el título es X. O dame un recuento de todos los artículos que usan una ID de imagen de 55.

Estoy usando las funciones de tipo de datos XML VALUE y QUERY para recuperar los datos.

select omID, 
    omText.query('/things/Fruit') 
    ,cast('<results>' + cast(omText.query('/things/Fruit') as varchar(max)) + '</results>' as xml) as Value 
    from dbo.myTable 
    where omText.value('(/things/Fruit/imageId)[1]', 'int') = 76 

Que solo funciona donde el id que estoy buscando es el primero en el documento. No parece buscar todo el xml.

Fundamentalmente el conjunto de resultados regresa con una fila para cada entrada en la TABLA, mientras que creo que necesito tener una fila para cada ELEMENTO coincidente ... No estoy seguro de cómo comenzar a escribir un grupo por este tho.

Estoy empezando a sentir que estoy haciendo esto más difícil de lo que necesita ... pensamientos & ideas por favor.

Respuesta

16

lo que estoy tratando de lograr es una forma de decir, en todos los datos XML en toda la mesa ... dame todos los xmlElements donde el título es X.

No estoy seguro de si comprendí totalmente su pregunta aquí o ¿está buscando esto? Se podría agarrar todos los/las cosas elementos/fruta al "nodos" y cruz unirse a ellos en contra de su "datos de referencia" en el myTable - el resultado sería una fila por cada elemento XML en su campo de datos XML:

select 
    omID, 
    T.Fruit.query('.') 
from 
    dbo.myTable 
cross apply 
    omText.nodes('/things/Fruit') as T(Fruit) 
where 
    T.Fruit.value('(title)[1]', 'varchar(50)') = 'X' 

O dame un recuento de todos los elementos que utilizan un ImageID de 55.

select 
    count(*) 
from 
    dbo.myTable 
cross apply 
    omText.nodes('/things/Fruit') as T(Fruit) 
where 
    T.Fruit.value('(imageId)[1]', 'int') = 55 

es eso lo que está buscando?

Marc

+1

Es ..... Eres una estrella. Saludos :) ¿No crees que puedes dirigirme hacia cualquier recurso decente para leer sobre la manipulación SQL XML? – GordonB

+2

¡Me alegro de poder ayudar, Gordon! El mejor artículo SQL XML DML que encontré hasta ahora es bastante antiguo, pero sigue siendo muy útil: http://www.15seconds.com/Issue/050803.htm –

+0

O aquí quizás: http://www.sqlservercentral.com/ Artículos/SQL + Server + 2005/XML / –

Cuestiones relacionadas