Detaillierte Erläuterung von Codebeispielen für den RAW-Modus von FOR XML

黄舟
Freigeben: 2017-03-22 17:03:13
Original
2225 Leute haben es durchsucht

Beschreibung:

Der Rohmodus konvertiert jede Zeile im Abfrageergebnissatz in ein XML-Element mit dem Elementnamen und wandelt die Spalten jeder Zeile in Zeilenattribute um.

Eine XML-Hierarchie kann durch Schreiben einer verschachtelten FOR XML-Abfrage generiert werden

Standardmäßig werden alle Nicht-Null-Werte als Attribute des -Elements zugeordnet.

Wenn Sie die Daten in der Abfrageergebnismenge in untergeordnete Elemente des konvertieren müssen, müssen Sie die Elements-Direktive

verwenden

Einzelheiten finden Sie im Beispiel:
FOR XML
RAW [ ('ElementName') ] 
    [ 
       <CommonDirectives> 
       [ , { XMLDATA | XMLSCHEMA [ (&#39;TargetNameSpaceURI&#39;) ]} ] 
       [ , ELEMENTS [ XSINIL | ABSENT ] 
    ] <CommonDirectives> ::= 
   [ , BINARY BASE64 ]
   [ , TYPE ]
   [ , ROOT [ (&#39;RootName&#39;) ] ]
Nach dem Login kopieren

Erstellen Sie eine Tabellenbasis mit der folgenden Struktur:

Fügen Sie Tabellendaten wie folgt ein:
列名数据类型允许空
idint允许
bodynvarchar(50)允许

idbody
1aaaa
2bbbb
3cccc
4
Beispiel:

A. Geben Sie die Informationen der Abfragedaten zurück und verwenden Sie den for XML-Rohmodus

/*
结果:
    <row id="1" body="aaaa" />
    <row id="2" body="bbbb" />
    <row id="3" body="dddd" />
    <row id="4" />
*/select * from base for xml raw;
Nach dem Login kopieren
, um die zu erstellen Die Ergebnismenge wird durch Angabe der ELEMENTS-Direktive in Form von Unterelementen angezeigt.

/*
结果:
    <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;
Nach dem Login kopieren
Uns ist aufgefallen, dass der Text mit der ID 4 in diesem Beispielsatz nicht angezeigt wird

Der Grund dafür ist, dass bei Verwendung des Elements-Befehls der folgende Befehl standardmäßig nicht angegeben wird. Bei Verwendung von abscent werden zu diesem Zeitpunkt keine Elemente für Nullwerte erstellt

Im folgenden Beispiel Satz, Nullwerte können in XML angezeigt werden, indem Elemente xsinil gleichzeitig und xsinil-Anweisungen angegeben werden, um Elemente mit Nullspaltenwerten zu erzeugen

Für jedes Datenelement wird es als -Element angezeigt, was den Eindruck erweckt, dass der Name des ein anderer ist.
/*
结果:
    <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;
Nach dem Login kopieren
C. Benennen Sie das -Element um

Wir alle wissen, dass jede XML-Datei ein Stammelement hat. Wie fügen wir sein Stammelement zu diesem XML-Text hinzu?
/*
结果:
    <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;
Nach dem Login kopieren
D. Um das Root-Element für die von for xml generierte XML-Datei anzugeben, kann

mit dem Root-Befehl angegeben werden. Das Standard-Root-Element ist

Derzeit scheint das generierte XML-Ergebnis sehr gut zu sein, aber wenn wir die Body-Spalte in der Datenbank in XML ändern möchten, wie ändert man das -Element?
/*
结果:
    <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;
Nach dem Login kopieren
E. Ändern Sie den Elementnamen

Das aktuelle Ergebnis entspricht im Wesentlichen dem Grundformat einer XML-Datei. Wir stellen uns vor, dass wir keine Spaltennamen für die ID angeben und Körper, noch geben Sie Stammelementnamen an, noch geben Sie Elementnamen an, welche Nachteile werden auftreten? Der Nullwert mit der ID 4 wird nicht angezeigt.
/*
结果:
    <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;
Nach dem Login kopieren
Seitdem scheint es keinen Spaltennamen zu geben. Der vorherige Satz kann noch etwas modifiziert werden

/*
结果:
    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;
Nach dem Login kopieren

/*
结果:
    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;
Nach dem Login kopieren
Modifizieren wir ihn noch einmal, damit das Ergebnis anders aussieht

Jetzt können Sie sehen, dass wir entsprechend unseren Anforderungen kombinieren können, um die von uns benötigten Ergebnisse zu generieren.
/*
结果:
    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;
Nach dem Login kopieren
In SQLServer2005 werden XML-Daten bereits vom Typ unterstützt, daher können Sie die schreiben TYPE-Anweisung zum Zurückgeben der Ergebnisse der FOR XML-Abfrage im XML-Datentyp, zum Beispiel:

Abschließend wird ein häufig verwendetes Beispiel verwendet, um die Anwendung des Musters für XML Raw vorzustellen.
/*
结果:
    {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;
Nach dem Login kopieren
Erstellen Sie die Schülertabelle Student. Die Tabellenstruktur ist wie folgt:

Fügen Sie die Tabellendaten wie folgt ein:

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)
Nach dem Login kopieren

建课程表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
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Codebeispielen für den RAW-Modus von FOR XML. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage