Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung von Codebeispielen für den RAW-Modus von FOR XML
Beschreibung:
Der Rohmodus konvertiert jede Zeile im Abfrageergebnissatz in ein XML-Element mit dem Elementnamen 2bef0154f7bc75ad48fa20d0234d078f 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 2bef0154f7bc75ad48fa20d0234d078f-Elements zugeordnet.
Wenn Sie die Daten in der Abfrageergebnismenge in untergeordnete Elemente des 2bef0154f7bc75ad48fa20d0234d078f 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') ] ]Erstellen Sie eine Tabellenbasis mit der folgenden Struktur:
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;
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;
C. Benennen Sie das 2bef0154f7bc75ad48fa20d0234d078f-Element umDer 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 2bef0154f7bc75ad48fa20d0234d078f-Element angezeigt, was den Eindruck erweckt, dass der Name des 2bef0154f7bc75ad48fa20d0234d078f 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;
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;
E. Ändern Sie den Elementnamenmit dem Root-Befehl angegeben werden. Das Standard-Root-Element ist 4216313e5055da45c6d0ded129c5d644
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 1d029f6197b5a3eb8a3fdf0a088ddf55-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;
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;
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;/* 结果: 1,aaaa;2,bbbb;3,dddd;4,null; */select id+0,',',isnull(body,'null')+'',';' from base for xml raw(''),elements;Modifizieren wir ihn noch einmal, damit das Ergebnis anders aussieht
/* 结果: 1,aaaa;2,bbbb;3,dddd;4,null; */select convert(nvarchar,id)+','+isnull(body,'null')+';' from base for xml raw(''),elements;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 '{'+convert(nvarchar,id)+','+isnull(body,'null')+'}' from base for xml raw(''),elements;
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)
建课程表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 student
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!