Выберите строки, содержащие узел xml, в любой позиции в документе - PullRequest
0 голосов
/ 22 декабря 2011

Я пытаюсь вернуть XML, который имеет определенный атрибут в SQL.

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>

запрос, который я использую для выбора этих полей, содержащих атрибут colorscheme:

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

Проблема, с которой я сталкиваюсь, состоит в том, что он выбирает только XML, в котором ColorScheme является первым полем. Если он расположен дальше в xml (что возможно), он не будет выбран. Я понимаю, что это связано с тем, что в моем запросе есть [1], но запрос не будет исправлен, если я удалю эту часть. Итак, что я могу поставить на его место, чтобы оно не относилось к конкретной позиции?

Ответы [ 2 ]

1 голос
/ 22 декабря 2011
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
1 голос
/ 22 декабря 2011
SELECT * 
FROM CustomSettings 
WITH (NOLOCK)
WHERE settings_xml.value('(/Settings/Item[@name="ColorScheme"]/@Name)[1]', 'varchar(25)') IS NOT NULL
order by 1 desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...