2012-03-14 4 views
6

SQL Server에 열 중 하나가 XML 데이터 형식 인 테이블이 있습니다. XML이 아닌 다른 열이 테이블에 있습니다. 다음은 컬럼에 저장되는 XML의 예입니다 : 내가 원하는 것은 테이블의 다른 컬럼과 일치하는 열의 일부 값과 일치하는 쿼리가SQL Server 2008에서 XML 데이터 형식 쿼리

<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> 

가, 나는를 얻으려면 질문 노드의 텍스트 특성 및 제어 노드의 응답 특성 누군가 이걸로 나를 도울 수 있습니까? 내가 하나 개 이상의 그룹 노드가있는 경우

편집

어떻게 변경해야? 이 시나리오에서는 각 질문의 텍스트와 답변이 각 질문과 함께 진행되기를 바랍니다. 아래를 참조

<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

다음을 살펴보십시오. http://msdn.microsoft.com/en-us/library/ms178030.aspx – RThomas

답변

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 

업데이트 : 여러 행에 대한 당신의 XML을 파쇄해야하는 경우

당신이 cross apply.nodes()를 사용할 수 있습니다.

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

위대한 작품입니다! AdultAsthma 노드 아래에 여러 그룹 노드가있는 경우 어떻게 변경해야합니까? 내 편집을 참조하십시오. –

+0

이것은 정말 멋지다! 고마워,이게 내가 필요한거야! –