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 [ ('TargetNameSpaceURI') ]} ] [ , ELEMENTS [ XSINIL | ABSENT ] ] <CommonDirectives> ::= [ , BINARY BASE64 ] [ , TYPE ] [ , ROOT [ ('RootName') ] ]
Fügen Sie Tabellendaten wie folgt ein:A. Geben Sie die Informationen der Abfragedaten zurück und verwenden Sie den for XML-Rohmodus
列名 数据类型 允许空 id int 允许 body nvarchar(50) 允许 Beispiel:
id body 1 aaaa 2 bbbb 3 cccc 4
, um die zu erstellen Die Ergebnismenge wird durch Angabe der ELEMENTS-Direktive in Form von Unterelementen angezeigt./* 结果: <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
Uns ist aufgefallen, dass der Text mit der ID 4 in diesem Beispielsatz nicht angezeigt wird
/* 结果: <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
C. Benennen Sie dasDer 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
Wir alle wissen, dass jede XML-Datei ein Stammelement hat. Wie fügen wir sein Stammelement zu diesem XML-Text hinzu?D. Um das Root-Element für die von for xml generierte XML-Datei anzugeben, kann/* 结果: <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('baseinfo'),elements xsinil;Nach dem Login kopieren
E. Ändern Sie den Elementnamenmit 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('baseinfo'),root('base'),elements xsinil;Nach dem Login kopieren
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('baseinfo'),root('base'),elements xsinil;Nach dem Login kopieren
Seitdem scheint es keinen Spaltennamen zu geben. Der vorherige Satz kann noch etwas modifiziert werdenJetzt können Sie sehen, dass wir entsprechend unseren Anforderungen kombinieren können, um die von uns benötigten Ergebnisse zu generieren./* 结果: 1aaaa2bbbb3dddd4 */ --因为id为int类型,为使id不出现列名,我们使id+0 --因为body为nvarchar类型,为使body不出现列名,我们使body+''select id+0,body+'' from base for xml raw(''), elements;Nach dem Login kopierenModifizieren wir ihn noch einmal, damit das Ergebnis anders aussieht/* 结果: 1,aaaa;2,bbbb;3,dddd;4,null; */select id+0,',',isnull(body,'null')+'',';' from base for xml raw(''),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:/* 结果: 1,aaaa;2,bbbb;3,dddd;4,null; */select convert(nvarchar,id)+','+isnull(body,'null')+';' from base for xml raw(''),elements;Nach dem Login kopieren
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 '{'+convert(nvarchar,id)+','+isnull(body,'null')+'}' from base for xml raw(''),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,表结构如下:
列名 数据类型 允许空 cid int 允许 name nvarchar(50) 允许 插入表数据如下:
id name 1 语文 2 数学 3 英语
建student_class表,表结构如下:
列名 数据类型 允许空 sid int cid int 插入数据如下:
cid sid 1 1 1 2 1 3 2 1 3 2 3 3
至此,数据结果是:
姓名 课程 张三 语文 张三 数学 张三 英语 李四 语文 王五 数学 王五 英语
我们需要最后的结果形式如下:
姓名 课程 张三 语文,数学,英语 李四 语文 王五 数学,英语
该如何实现呢?
/* 结果: 张三 语文,数学,英语 李四 语文 王五 数学,英语 */select [name], stuff( ( select ','+[name] from sclass where cid in ( select cid from student_class where student.sid=student_class.sid ) for xml raw(''),elements ), 1,1,'') sclassfrom studentNach dem Login kopierenDas 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!