2012-03-14 18 views
6

Tengo una tabla en SQL Server en la que una de las columnas es un XML Datatype. Hay otras columnas en la tabla que no son XML. Este es un ejemplo del XML que se almacena en la columna:Tipo de datos XML En SQL Server 2008 Query

<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" /> 
     <Control type="TextBox" id="txtActScore" Answer="" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 

Lo que quiero es una consulta que coincide con algunos valores de las otras columnas de la tabla y para aquellas columnas que coinciden, quiero obtener la atributo de texto del nodo de pregunta y el atributo de respuesta del nodo de control. ¿Puede alguien ayudarme con esto?

EDITAR

Lo que necesita ser cambiado si tengo más de un nodo de grupo? En esta escena, me gustaría que el texto de cada pregunta y la respuesta coincidan con cada pregunta. Ver más abajo:

<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" /> 
     <Control type="TextBox" id="txtActScore" Answer="" /> 
    </Controls> 
    </Group> 
    <Group> 
    <Question text="Do You Have Asthma?:" ForeColor="Black" /> 
    <Controls> 
     <Control type="RadioButton" id="rbHaveAsthmaYes" text="Yes" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
     <Control type="RadioButton" id="rbHaveAsthmaNo" text="No" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 
+2

dar a este un buen vistazo sobre: ​​http://msdn.microsoft.com/en-us/library/ms178030.aspx – RThomas

Respuesta

6
declare @T table 
(
    XMLCol xml 
) 

insert into @T values 
('<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black"/> 
     <Control type="TextBox" id="txtActScore" Answer="Answer" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 
') 

select XMLCol.value(N'(/AdultAsthma/Group/Question/@text)[1]', 'nvarchar(max)'), 
     XMLCol.value(N'(/AdultAsthma/Group/Controls/Control/@Answer)[1]', 'nvarchar(max)') 
from @T 

Actualización:

Cuando tenga que destrozar el código XML a varias filas puede utilizar .nodes() en un cross apply.

declare @T table 
(
    XMLCol xml 
) 

insert into @T values 
('<AdultAsthma> 
    <Group> 
    <Question text="Act Score:" ForeColor="Green" /> 
    <Controls> 
     <Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" /> 
     <Control type="TextBox" id="txtActScore" Answer="" /> 
    </Controls> 
    </Group> 
    <Group> 
    <Question text="Do You Have Asthma?:" ForeColor="Black" /> 
    <Controls> 
     <Control type="RadioButton" id="rbHaveAsthmaYes" text="Yes" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
     <Control type="RadioButton" id="rbHaveAsthmaNo" text="No" GroupName="Diagnosed" ForeColor="Black" Answer="False" /> 
    </Controls> 
    </Group> 
</AdultAsthma> 
') 

select X.N.value(N'(Question/@text)[1]', 'nvarchar(max)'), 
     X.N.value(N'(Controls/Control/@Answer)[1]', 'nvarchar(max)') 
from @T as T 
    cross apply T.XMLCol.nodes(N'/AdultAsthma/Group') as X(N) 
+0

esto funciona muy bien! ¿Qué debo cambiar si tengo varios grupos de nodos en el nodo AdultAsthma? Ver mi edición –

+0

¡Esto es genial! Gracias, hombre, esto es exactamente lo que necesitaba! –

Cuestiones relacionadas