2012-03-14 21 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> 

は、私が取得したいです質問ノードのテキスト属性とコントロールノードの回答属性を使用します。誰かがこれで私を助けることができますか?私は1つのグループのノードが複数ある場合は変更する必要がどのような

EDIT

?この風景では、各質問の文章と答えがそれぞれの質問に合っていなければなりません。以下を参照してください:

<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 

更新:

あなたがcross apply.nodes()を使用することができ、複数の行にあなたのXMLを細断処理す​​る必要がある場合。

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

これはとても涼しいです!ありがとう、これはまさに私が必要なものです! –

関連する問題