2011-12-22 10 views
0

sqlに特定の属性を持つxmlを返そうとしています。文書の任意の位置にxmlノードを含む行を選択してください

XMLは次のようになります。

<Settings> 
    <Item Name="ColorScheme" Type="XDocument"> 
    <ColorScheme> 
    <ItemStyle Name="element-song" Title="Song" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" /> 
    <ItemStyle Name="element-song-print" Title="Song (print)" ForeColor="#0538ac" BackColor="" Media="2" /> 
    <ItemStyle Name="element-spot" Title="Spot" ForeColor="#048b27" BackColor="#e9ffee" Media="1" /> 
    <ItemStyle Name="element-spot-print" Title="Spot (print)" ForeColor="#048b27" BackColor="" Media="2" /> 
    <ItemStyle Name="element-programming" Title="Programming" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" /> 
    <ItemStyle Name="element-programming-print" Title="Programming (print)" ForeColor="#0538ac" BackColor="" Media="2" /> 
    <ItemStyle Name="element-continued-programming" Title="Continued programming" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" /> 
    <ItemStyle Name="element-continued-programming-print" Title="Continued programming (print)" ForeColor="#0538ac" BackColor="" Media="2" /> 
    </ColorScheme> 
    </Item> 
    <Item Name="SendWeeklyNewAccountEmail" Type="Boolean">False</Item> 
    <Item Name="UseEstimatedDurationsForAnalysis" Type="Boolean">True</Item> 
    <Item Name="CalendarStyle" Type="Int32">1</Item> 
    <Item Name="IncludeAdExForAnalysis" Type="Boolean">True</Item> 
</Settings> 

私はカラースキームの属性が含まれているこれらのフィールドを選択するために使用するクエリは、次のとおりです。

SELECT * FROM CustomSettings WITH (NOLOCK)WHERE settings_xml.value('(/Settings/Item/@Name)[1]', 'varchar(25)') = 'ColorScheme' order by 1 desc 

私はに実行しています問題は、それが唯一の選択であります最初のフィールドとしてColorSchemeを持つxml。もしそれがxml(それは可能性があります)にさらに位置するなら、それは選択されません。私はこれが私の質問に[1]を持っていることが原因であると理解していますが、この部分を削除してもクエリは正しくありません。だから私はそれを特定の位置にしないためにその場所に置くのですか?

答えて

1
SELECT * 
FROM CustomSettings 
WITH (NOLOCK) 
WHERE settings_xml.value('(/Settings/Item[@name="ColorScheme"]/@Name)[1]', 'varchar(25)') IS NOT NULL 
order by 1 desc 
1
DECLARE @x TABLE (x XML) 

INSERT INTO @x 
VALUES ('<Settings> <Item Name="ColorScheme" Type="XDocument"> <ColorScheme>  <ItemStyle Name="element-song" Title="Song" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" />  <ItemStyle Name="element-song-print" Title="Song (print)" ForeColor="#0538ac" BackColor="" Media="2" />  <ItemStyle Name="element-spot" Title="Spot" ForeColor="#048b27" BackColor="#e9ffee" Media="1" />  <ItemStyle Name="element-spot-print" Title="Spot (print)" ForeColor="#048b27" BackColor="" Media="2" />  <ItemStyle Name="element-programming" Title="Programming" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" />  <ItemStyle Name="element-programming-print" Title="Programming (print)" ForeColor="#0538ac" BackColor="" Media="2" />  <ItemStyle Name="element-continued-programming" Title="Continued programming" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" />  <ItemStyle Name="element-continued-programming-print" Title="Continued programming (print)" ForeColor="#0538ac" BackColor="" Media="2" /> </ColorScheme> </Item> <Item Name="SendWeeklyNewAccountEmail" Type="Boolean">False</Item> <Item Name="UseEstimatedDurationsForAnalysis" Type="Boolean">True</Item> <Item Name="CalendarStyle" Type="Int32">1</Item> <Item Name="IncludeAdExForAnalysis" Type="Boolean">True</Item> </Settings> ') 
, ('<Settings> <Item Name="SendWeeklyNewAccountEmail" Type="Boolean">False</Item> <Item Name="UseEstimatedDurationsForAnalysis" Type="Boolean">True</Item> <Item Name="CalendarStyle" Type="Int32">1</Item> <Item Name="IncludeAdExForAnalysis" Type="Boolean">True</Item> </Settings>)') 
, ('<Settings> <Item Name="IncludeAdExForAnalysis" Type="Boolean">True</Item> <Item Name="ColorScheme" Type="XDocument"> <ColorScheme>  <ItemStyle Name="element-song" Title="Song" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" />  <ItemStyle Name="element-song-print" Title="Song (print)" ForeColor="#0538ac" BackColor="" Media="2" />  <ItemStyle Name="element-spot" Title="Spot" ForeColor="#048b27" BackColor="#e9ffee" Media="1" />  <ItemStyle Name="element-spot-print" Title="Spot (print)" ForeColor="#048b27" BackColor="" Media="2" />  <ItemStyle Name="element-programming" Title="Programming" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" />  <ItemStyle Name="element-programming-print" Title="Programming (print)" ForeColor="#0538ac" BackColor="" Media="2" />  <ItemStyle Name="element-continued-programming" Title="Continued programming" ForeColor="#0538ac" BackColor="#e8f1fa" Media="1" />  <ItemStyle Name="element-continued-programming-print" Title="Continued programming (print)" ForeColor="#0538ac" BackColor="" Media="2" /> </ColorScheme> </Item> <Item Name="SendWeeklyNewAccountEmail" Type="Boolean">False</Item> <Item Name="UseEstimatedDurationsForAnalysis" Type="Boolean">True</Item> <Item Name="CalendarStyle" Type="Int32">1</Item> </Settings> ') 


SELECT * 
FROM @x x1 
WHERE x1.x.exist('(/Settings/Item[@Name="ColorScheme"])') = 1 
関連する問題