Доступ к дочерним узлам в столбцах SQLXML с помощью XQuery - PullRequest
0 голосов
/ 23 мая 2011

У меня есть база данных, в которой есть таблица со столбцом XML.Данные XML имеют несколько дочерних узлов, которые выглядят примерно так:

<test>
  <result id="1234">
    <data elementname="Message">some error message</data>
    <data elementname="Cat">Cat01</data>
    <data elementname="Type">WARNING</data>
  </result>
  <result id="5678">
    <data elementname="Message">some error message</data>
    <data elementname="Cat">Cat01</data>
    <data elementname="Type">WARNING</data>
  </result>
</test>

Элемент Cat может иметь несколько различных значений.Я пытаюсь создать отчеты по этим данным, поэтому я хотел бы получить список всех категорий, которые будут использоваться в наших данных.Это мой запрос:

Select Id, XmlData.query('/test/result/data[@elementname = ''Cat''] ')  AS  Message
From Table
WHERE XmlData.exist('/test/result/data[@elementname = ''Cat'']') = 1
ORDER BY FriendlyName

Это правильно получает все строки в моей таблице с этим типом категоризации (в той же таблице будут другие результаты без этого элемента), но все категории объединеныв один столбец для каждой записи таблицы:

Id1, <data elementname="Cat">Cat01</data><data elementname="Cat">Cat01</data>
Id2, <data elementname="Cat">Cat01</data><data elementname="Cat">Cat01</data>

Я включил столбец Id, чтобы было легко увидеть, откуда поступают данные, основная проблема заключается в том, что я могу получить его только для объединения значенийдля каждой строки - мне нужно, чтобы у каждого из этих элементов данных была своя собственная строка, а затем, возможно, сделать Select Distinct для результата.

Есть ли способ, которым я могу это сделать?

Спасибо

1 Ответ

1 голос
/ 24 мая 2011

Всегда Google после вы отправляете свой вопрос ....

Думаю, я нашел ответ здесь: http://blogs.msdn.com/b/simonince/archive/2009/04/24/flattening-xml-data-in-sql-server.aspx

SELECT  DISTINCT  cref.value('(text())[1]', 'varchar(50)') as Cat
FROM   
      SGIS CROSS APPLY 
      Data.nodes('/test/result') AS Results(rref) CROSS APPLY
      rref.nodes('data[@elementname = ''Cat'']') AS Categories(cref)  

Кажется, ключКрест Применить ключевые слова

...