Explication détaillée des exemples de code pour le mode RAW de FOR XML

黄舟
Libérer: 2017-03-22 17:03:13
original
2225 Les gens l'ont consulté

Description :

le mode brut convertit chaque ligne de l'ensemble de résultats de la requête en un élément XML avec le nom de l'élément et convertit les colonnes de chaque ligne en attributs de ligne.

Une hiérarchie XML peut être générée en écrivant une requête FOR XML imbriquée

Par défaut, toutes les valeurs non nulles seront mappées en tant qu'attributs de l'élément 🎜 >Si vous devez convertir les données de l'ensemble de résultats de la requête en éléments enfants de l'élément , vous devez utiliser la directive elements

Syntaxe :

.

Pour plus de détails, voir l'exemple :
FOR XML
RAW [ ('ElementName') ] 
    [ 
       <CommonDirectives> 
       [ , { XMLDATA | XMLSCHEMA [ (&#39;TargetNameSpaceURI&#39;) ]} ] 
       [ , ELEMENTS [ XSINIL | ABSENT ] 
    ] <CommonDirectives> ::= 
   [ , BINARY BASE64 ]
   [ , TYPE ]
   [ , ROOT [ (&#39;RootName&#39;) ] ]
Copier après la connexion

Créez une table Base avec la structure suivante :

Insérez les données du tableau comme suit :
列名数据类型允许空
idint允许
bodynvarchar(50)允许

idbody
1aaaa
2bbbb
3cccc
4
Exemple :

A. Renvoyez les informations sur les données de la requête, utilisez le mode brut for XML

/*
结果:
    <row id="1" body="aaaa" />
    <row id="2" body="bbbb" />
    <row id="3" body="dddd" />
    <row id="4" />
*/select * from base for xml raw;
Copier après la connexion
pour définir le résultat. apparaissent sous forme de sous-éléments en spécifiant la directive ELEMENTS.

/*
结果:
    <row>
      <id>1</id>
      <body>aaaa</body>
    </row>
    <row>
      <id>2</id>
      <body>bbbb</body>
    </row>
    <row>
      <id>3</id>
      <body>dddd</body>
    </row>
    <row>
      <id>4</id>
    </row>
*/select * from base for xml raw,elements;
Copier après la connexion
Nous avons remarqué que le corps d'identifiant 4 n'est pas affiché dans cet exemple de phrase
<🎜. >La raison est que lors de l'utilisation de la commande elements, si la commande suivante n'est pas spécifiée, la valeur par défaut est Using abscent, aucun élément ne sera créé pour les valeurs nulles pour le moment

Dans l'exemple de phrase suivant, les valeurs nulles peuvent être affichées en XML en utilisant les éléments xsinil

B. Spécifiez la directive elements en même temps et les instructions xsinil pour produire des éléments avec des valeurs de colonne nulles

<🎜. >

Chaque élément de données est affiché avec un élément , ce qui met les gens mal à l'aise. Comment modifier Le nom de l'élément est un autre nom.
/*
结果:
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>1</id>
      <body>aaaa</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>2</id>
      <body>bbbb</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>3</id>
      <body>dddd</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>4</id>
      <body xsi:nil="true" />
    </row>
*/select * from base for xml raw,elements xsinil;
Copier après la connexion
C. l'élément

Nous savons tous que chaque fichier XML a un élément racine, comment ajouter son élément racine à ce texte XML
/*
结果:
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>1</id>
      <body>aaaa</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>2</id>
      <body>bbbb</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>3</id>
      <body>dddd</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>4</id>
      <body xsi:nil="true" />
    </baseinfo>
*/select * from base for xml raw(&#39;baseinfo&#39;),elements xsinil;
Copier après la connexion
<🎜. >D. Pour spécifier l'élément racine du XML généré par for XML,
peut être spécifié à l'aide de la commande root. L'élément racine par défaut est

<🎜. >

À l'heure actuelle, le résultat XML généré semble être très bon, mais si nous voulons changer la colonne body de la base de données en XML Comment modifier l'élément le nom de l'élément

/*
结果:
    <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <baseinfo>
        <id>1</id>
        <body>aaaa</body>
      </baseinfo>
      <baseinfo>
        <id>2</id>
        <body>bbbb</body>
      </baseinfo>
      <baseinfo>
        <id>3</id>
        <body>dddd</body>
      </baseinfo>
      <baseinfo>
        <id>4</id>
        <body xsi:nil="true" />
      </baseinfo>
    </base>
*/select * from base for xml raw(&#39;baseinfo&#39;),root(&#39;base&#39;),elements xsinil;
Copier après la connexion
Le résultat actuel est fondamentalement conforme au format de base d'un xml , alors, nous imaginons que si nous ne spécifions pas les noms de colonnes pour id et body, ni ne spécifions noms d'éléments racine, ni spécifier les noms d'éléments, quels inconvénients se produiront ?

Mais, pour ce qui précède. En conséquence, nous semblons incapables de distinguer chaque élément de données et la valeur nulle avec l'identifiant. 4 ne s'affiche pas. Comment le modifier ? Voir la phrase suivante

/*
结果:
    <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <baseinfo>
        <id>1</id>
        <data>aaaa</data>
      </baseinfo>
      <baseinfo>
        <id>2</id>
        <data>bbbb</data>
      </baseinfo>
      <baseinfo>
        <id>3</id>
        <data>dddd</data>
      </baseinfo>
      <baseinfo>
        <id>4</id>
        <data xsi:nil="true" />
      </baseinfo>
    </base>
*/select id,body data from base for xml raw(&#39;baseinfo&#39;),root(&#39;base&#39;),elements xsinil;
Copier après la connexion
Depuis, il semble qu'il n'y ait pas de nom de colonne Les avantages qu'elle nous apporte. modifié un peu plus

/*
结果:
    1aaaa2bbbb3dddd4
*/
--因为id为int类型,为使id不出现列名,我们使id+0
--因为body为nvarchar类型,为使body不出现列名,我们使body+&#39;&#39;select id+0,body+&#39;&#39; from base for xml raw(&#39;&#39;), elements;
Copier après la connexion

/*
结果:
    1,aaaa;2,bbbb;3,dddd;4,null;
*/select id+0,&#39;,&#39;,isnull(body,&#39;null&#39;)+&#39;&#39;,&#39;;&#39; from base for xml raw(&#39;&#39;),elements;
Copier après la connexion
Modifions-le encore pour que le résultat apparaisse d'une autre manière

<🎜. >
Vous pouvez maintenant voir que nous pouvons combiner selon nos besoins pour générer les résultats dont nous avons besoin
/*
结果:
    1,aaaa;2,bbbb;3,dddd;4,null;
*/select convert(nvarchar,id)+&#39;,&#39;+isnull(body,&#39;null&#39;)+&#39;;&#39; from base for xml raw(&#39;&#39;),elements;
Copier après la connexion
Dans SQLServer2005, les données XML sont déjà prises en charge, vous pouvez donc écrire l'instruction TYPE pour renvoyer le type. résultats de la requête FOR XML dans le type de données xml :

/*
结果:
    {1,aaaa}{2,bbbb}{3,dddd}{4,null}
*/select &#39;{&#39;+convert(nvarchar,id)+&#39;,&#39;+isnull(body,&#39;null&#39;)+&#39;}&#39; from base for xml raw(&#39;&#39;),elements;
Copier après la connexion
Enfin, un exemple courant est utilisé pour introduire l'application brute du modèle
.

Créez la table student student, la structure de la table est la suivante :

Insérez les données de la table comme suit :
declare @string nvarchar(1000)declare @xml xml/*
    消息257,级别16,状态3,第8行
    不允许从数据类型xml到nvarchar的隐式转换。请使用CONVERT函数来运行此查询。
*/
--set @string=(select id,body from base for xml raw,type)set @xml=(select id,body from base for xml raw,type)
Copier après la connexion

建课程表sclass,表结构如下:

列名数据类型允许空
cidint允许
namenvarchar(50)允许

插入表数据如下:

idname
1语文
2数学
3英语

建student_class表,表结构如下:

列名数据类型允许空
sidint
cidint

插入数据如下:

cidsid
11
12
13
21
32
33

至此,数据结果是:

姓名课程
张三语文
张三数学
张三英语
李四语文
王五数学
王五英语

我们需要最后的结果形式如下:

姓名课程
张三语文,数学,英语
李四语文
王五数学,英语

该如何实现呢?

/*
结果:
    张三    语文,数学,英语
    李四    语文
    王五    数学,英语
*/select [name],            
stuff(
(                    
select &#39;,&#39;+[name]                    
from sclass                    
where cid in (                                    
select cid                                    
from student_class                                    
where student.sid=student_class.sid                                
)                    
for xml raw(&#39;&#39;),elements                
),            
1,1,&#39;&#39;) sclassfrom student
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal