/ / Comment fusionner plusieurs éléments d'un champ XML dans SQL Server - xml, sql-server-2008

Comment fusionner plusieurs éléments d'un champ XML dans SQL Server - xml, sql-server-2008

J'essaie de travailler avec certaines données XML contenues dans notre base de données.

Le point de départ est un tableau avec cette ébauche:

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

un extrait de code XML typique pourrait être:

<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>

Ce que je veux réaliser à la fin est une vue montrant tous les mots-clés regroupés dans un seul document XML suivant le même schéma par la valeur de FKSiteID.

Comme étape intermédiaire, j’essayais d’extraire tous les mots-clés, mais je n’ai pas réussi à le faire sans utiliser une fonction de tableau et CROSS APPLY.

Un autre indice?

Réponses:

2 pour la réponse № 1

La fusion des documents est faisable, mais vousêtre sujet à un bogue / une fonctionnalité d'espace de noms dans xquery. Il semble que l'espace de noms utilisé avec FOR XML se répercute sur tous les niveaux de nœud. Il crée un XML valide, mais il n’est pas lisible et totalement redondant. Plus ici

J'espère que c'est ce que vous recherchez:

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 pour la réponse № 2

En googlant un peu mieux, j'ai trouvé des guides sur msdn expliquant comment résoudre le problème.

C'est la solution partielle au problème

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)
)

J'essayais de grouper par ST.FKSiteID et d'agréger les valeurs, mais apparemment, il n'y a pas de fonction d'agrégat fonctionnant avec des données XML.

Quel dommage.