Как объединить несколько элементов из поля XML в SQL Server - PullRequest
2 голосов
/ 10 мая 2011

Я пытаюсь работать с некоторыми XML-данными, которые есть в нашей базе данных.

Отправной точкой является таблица с таким грубым контуром:

CREATE TABLE MyTable
(
    ID INT NOT NULL IDENTITY(1,1),
    ...,
    FKSiteID INT NOT NULL REFERENCES ...,
    ...,
    Keywords XML(DOCUMENT info.Keywords) NULL
)

типичный фрагмент XML может быть:

<keywords xmlns="http://www.educations.com/Info/Keywords">
  <keyword>keyword 1</keyword>
  <keyword>keyword 2</keyword>
  <keyword>keyword 3</keyword>
  <keyword>keyword 4</keyword>
  <keyword>keyword 5</keyword>
</keywords>

В конце я хочу получить представление, показывающее все ключевые слова, сгруппированные в одном документе XML, следуя той же схеме, по значению FKSiteID.

В качестве среднего шага я пытался извлечь все ключевые слова, но мне не удалось сделать это без использования табличной функции и CROSS APPLY к ней таблицы.

Любой другой намек?

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Объединение документов выполнимо, однако вы будете подвержены ошибке / функции пространства имен в xquery.Кажется, что пространство имен при использовании с FOR XML каскадируется на всех уровнях узла.Он создает действительный XML, но он не так удобочитаем и полностью избыточен.Подробнее здесь

Надеюсь, это то, что вы ищете:

declare @MyTable table (
    ID INT NOT NULL IDENTITY(1,1),
    FKSiteID INT NOT NULL,
    Keywords XML NULL
)

insert into @MyTable (FKSiteID, Keywords)
    values  (1, '<keywords xmlns="http://www.educations.com/Info/Keywords">
                  <keyword>keyword 1</keyword>
                  <keyword>keyword 2</keyword>
                  <keyword>keyword 3</keyword>
                  <keyword>keyword 4</keyword>
                  <keyword>keyword 5</keyword>
                </keywords>'
            ),
            (1, '<keywords xmlns="http://www.educations.com/Info/Keywords">
                  <keyword>keyword 6</keyword>
                  <keyword>keyword 7</keyword>
                </keywords>'),
            (2, '<keywords xmlns="http://www.educations.com/Info/Keywords">
                  <keyword>keyword 21</keyword>
                </keywords>')

-- you probably have lookup table instead of the below cte          
;with XMLNAMESPACES('http://www.educations.com/Info/Keywords' AS ns),
c_Sites (FKSiteId)
as  (   select  distinct FKSiteId 
        from    @MyTable
    )
select  FKSiteID, 
        (   select Keywords.query('ns:keywords/*')
            from    @MyTable i 
            where   i.FKSiteID = O.FKSiteId
            for xml path(''), root('keywords'), type
        )
from c_Sites o;
0 голосов
/ 11 мая 2011

Погуглив немного лучше, я нашел руководство по msdn, рассказывающее, как решить проблему.

Это частичное решение проблемы

WITH XMLNAMESPACES ('http://www.educations.com/Info/Keywords' AS a )
(
    SELECT ST.FKSiteID AS SiteID, K.Keywords.value('.','nvarchar(max)') AS Keyword
    FROM 
        info.SearchTexts ST
        CROSS APPLY ST.Keywords.nodes('a:keywords/a:keyword') AS K(Keywords)
)

Я пытался сгруппировать по ST.FKSiteID и агрегировать значения, но, по-видимому, нет агрегатной функции, работающей с данными XML.

Такой позор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...