2009-12-11 15 views
20

Aquí está mi problema: del siguiente XML que está dentro de una columna, quiero saber si el valor de una variable con el nombre 'Habilitado' es igual a 'Sí' dado un paso Id y un Id. de componenteXPath para recuperar el valor SQL XML

'<xml> 
    <box stepId="1"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
    <box stepId="2"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
</xml>' 

Respuesta

31

actualización

Mi recomendación sería la de triturar el XML en las relaciones y hacer búsquedas y se une a la relación resultado, de una manera orientada conjunto, en lugar de la moda procedimiento de buscar nodos específicos en el XML. Aquí es un simple consulta XML que tritura los nodos y atributos de interés:

select x.value(N'../../../../@stepId', N'int') as StepID 
    , x.value(N'../../@id', N'int') as ComponentID 
    , x.value(N'@nom',N'nvarchar(100)') as Nom 
    , x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x) 

Sin embargo, si debe utilizar un XPath que recupera exactamente el valor de la participación:

select x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled"]') t(x) 

Si el stepID y ID de componente son columnas, no variables, debe usar sql: column() en lugar de sql: variable en los filtros XPath. Ver Binding Relational Data Inside XML Data.

Y finaly si todo lo que necesita es para comprobar si hay existencia puede utilizar el método exist() XML:

select @x.exist(
    N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled" and @valeur="Yes"]') 
+4

¿Qué es '@ x'? * (relleno de comentario a 15 caracteres) * –

+3

Sospecho que tenía 'DECLARAR @x XML = (xml de la pregunta);' sobre sus declaraciones en la ventana de consulta del SQL Server para probar el uso de ese XML pero lo eliminó de su respuesta porque hubiera sido redundante. Todo eso para decir que sospecho que es una variable que contiene el XML de la pregunta. – sirdank

2

creo que la consulta XPath que desea es algo como esto:

/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"] 

Esto debe conseguir que las variables que se denominan "activado" con un valor de "Sí" para la especificada $ stepId y $ componentId . Esto supone que su xml comienza con una etiqueta como la que muestra, y no

Si las cosas XPath de SQL Server 2005 son bastante sencillas (nunca las he usado), entonces la consulta anterior debería funcionar. De lo contrario, alguien más puede tener que ayudarte con eso.

+0

Gracias, eso ayudó. ¿Cómo puedo devolver un verdadero o falso si se encuentra o no una coincidencia? O devuelva un 0 o 1. – joerage

+0

No estoy seguro.Usted podría intentar algo como esto: Si el recuento ()> = 1 SELECT 1 ELSE SELECT 0 –

+0

Se puede utilizar el método de existir. Field.EXIST ('xpath') –

Cuestiones relacionadas