Comelio GmbH Rellinghauser Straße 10 D-45128 Essen Deutschland Fon: 0201-437517-0 Fax: 0201-437517-10 info@comelio.com
Comelio GmbH Goethestraße 34 D-13086 Berlin Deutschland info@comelio.com
Comelio GmbH (Ecos) Glockengießerwall 17 D-20095 Hamburg Deutschland info@comelio.com
Comelio GmbH (Ecos) Mainzer Landstraße 27-31 D-60329 Frankfurt Deutschland info@comelio.com
Comelio GmbH (Ecos) Stiglmaierplatz/Dachauer Str. 37 D-80335 München Deutschland info@comelio.com
Comelio GmbH (Ecos) Liebknechtstr. 33 D-70565 Stuttgart Deutschland info@comelio.com
Comelio GmbH Nevinghoff 16 D-48147 Münster Deutschland
Comelio GmbH Friedrich - List - Platz 1 D-04103 Leipzig Deutschland
Comelio GmbH St. Johanner Strasse 41-43 D-66111 Saarbrücken Deutschland
Comelio GmbH Kaiser-Wilhem-Ring 27–29 D-50672 Köln Deutschland
Comelio GmbH Münsterstraße 248 D-40470 Düsseldorf Deutschland
Comelio GmbH Fürther Strasse D-90429 Nürnberg Deutschland
Comelio GmbH
Bremen Deutschland

|
Comelio-Blog > MS SQL Server > Datentypmethoden für XML-Bearbeitung Datentypmethoden für XML-Bearbeitung
Nachdem man schon gespeicherte XML-Daten aus der Datenbank oder dem Dateisystem
abgerufen oder auf Basis einer Abfrage zusammengesetzt hat, stellt sich die Frage,
wie man diese verarbeiten kann. Dazu bietet sich zunächst die Möglichkeit
an, sie wieder in relationale Darstellungen zurückzuwandeln, wie dies über
OPENXML geschieht. Als weitere Alternative stehen eine Reihe von Methoden zur
Verfügung, die (wie in Oracle übrigens) direkt mit dem Datentyp xml
verknüpft sind. Sie lassen sich über eine objektorientierte Punktnotation
aufrufen und dienen hauptsächlich dazu, XML-Daten weiter abzufragen und sie
für eine weitere Verarbeitung zu untersuchen oder zu filtern.
|
 | Kontakt
|
Verarbeiten und abfragen mit Datentypmethoden
Für die Verarbeitung benutzt man im Wesentlichen XPath oder XQuery, zwei
Abfragemöglichkeiten für XML-Daten, die auch in solchen Techniken
wie XSLT (eXtensible Stylesheet Language for Transformations, XML-basierte
Skriptsprache zur XML-Umwandlung in XML/HTML oder Text), Datenbanken wie MS
SQL Server oder Oracle sowie verschiedenen Programmiersprachen oder integrierten
Techniken wie DOM (Document Object Model, standardisierte Klassen- und Methodensammlung
zur XML-Verarbeitung in diversen Programmiersprachen) genutzt werden. Beide
Techniken sind durchaus sehr umfangreich, können allerdings sinnvoll nicht
in vollem Umfang in T-SQL genutzt werden, obwohl dies syntaktisch durchaus
möglich ist. Sie werden in den nachfolgenden Abschnitten soweit dargestellt,
dass ein T-SQL-Programmierer die Methoden überhaupt nutzen kann.
Die folgende Liste stellt zunächst die verschiedenen Methoden dar:
- query() erlaubt es, XML-Daten mit Hilfe von XQuery abzufragen. Syntax: query
('XQuery')
- value() erlaubt es, einen Wert aus XML in einem bestimmten SQL-Datentyp
abzurufen. Syntax: value (XQuery, SQLType)
- exist() erlaubt es, zu überprüfen, ob eine Abfrage ein nicht
leeres Ergebnis liefert. Syntax: exist (XQuery)
- modify() erlaubt es, Änderungen an XML-Daten auszuführen (XML
DML). Syntax: modify (XML_DML)
- nodes() erlaubt es, XML in Teilen abzurufen, die in einzelnen Schritten
bearbeitet oder in relationale Strukturen übertragen werden sollen. Syntax:
nodes (XQuery) as Table(Column)
Abfragen ausführen
Die Methode query() erwartet einen XPath- oder einen XQuery-Ausdruck, wobei
in den nachfolgenden Beispielen zunächst XPath aufgrund der Kürze
zum Einsatz kommt. Dabei ist die Methode an sich weniger wichtig für die
Ausführung einer Abfrage als ein korrekter und sinnvoller XPath-Ausdruck,
denn die Methode an sich erwartet nur eine Zeichenkette als Parameter. Diese
Zeichenkette jedoch muss sich zu einer sinnvollen Anweisung der genannten Techniken
auflösen, welche durchaus umfangreich sein kann.
Das nachfolgende Beispiel erstellt aus einer Abfrage, welche die Produkte mit
schwarzer Farbe abruft, eine neue XML-Datei aus vor- und nachgeschalteten Wurzelelement-Tags.
Diese XML-Struktur prüft man mit exist() ab, ob nun auch Produkte mit Farbe
Orange enthalten sind, was allerdings (ganz überraschend) nicht der Fall
ist.
SET @resultXML = @productXML.query('//Product[Details/Color =
"Black"]')
SELECT CONVERT(xml,
''
+ CAST(@resultXML AS nvarchar(max))
+ '') AS XML
-- Existenzprüfung
DECLARE @exist int
SET @exist = @productXML.exist('//Product[Details/Color =
"Orange"]')
IF @exist = 0 BEGIN
PRINT 'Keine Produkte in Orange' + STR(@exist)
END
Als Ergebnis erhält man eine Liste von Product-Elementen in der gefilterten
Farbe in einem umfassenden Product-List-Element mit den enthaltenen Name-Elementen.
<Product-List>
<Product>
<Name>Road-750 Black, 52</Name>
</Product>
<Product>
<Name>Road-750 Black, 48</Name>
</Product>
</Product-List>
Im weiteren Verlauf des Kapitels folgen noch ausführliche Erläuterungen
zu den beiden möglichen Techniken XPath und XQuery, ohne weclche diese
Methode nicht benutzbar ist.
Datenänderungen ausführen
Auch Datenänderungen sind in einer xml-Spalte/-Variable möglich,
was mit einer Zeichenkette, in der die XML-Daten abgespeichert sind, nicht
möglich ist. Dazu steht die modify()-Methode bereit, welche Syntax in
der so genannten XML DML (Data Modification Language) erwartet. Es handelt sich
dabei um eine Erweiterung des XQuery-Standards mit den Schlüsselwörtern
insert für Einfügevorgänge, delete für Löschvorgänge
und replace value of für Ersetzungsvorgänge. Es gibt einige Einschränkungen,
die bei typisiertem und nicht typisiertem XML zu beachten sind. Typisiertes
XML ist XML, welches über XML Schema beschrieben und daher validiert werden
kann, wobei dies ein Thema im folgenden Kapitel ist. In beiden Fällen
können die Attribute xmlns, xmlns:* und xml:base nicht hinzugefügt,
geändert oder gelöscht werden. Typisiertes XML kann darüber
hinaus auch nicht xsi:nil und xsi:type mit den DML-Anweisungen bearbeitet werden.
Nicht typisiertes XML kann dagegen sehr wohl xsi:nil verwenden. Da typisiertes
XML von XML Schema abhängt, müssen die Änderungen sich unmittelbar
zu gültigem XML ergeben.
Die allgemeine Syntax für diese Bearbeitungsmöglichkeiten besteht
neben den erwähnten zusätzlichen Schlüsselwörtern aus einigen
weiteren Angaben, die insbesondere beim Einfügen aufgrund der Reihenfolgenproblematik
(vorher, nachher etc. einfügen) notwendig sind. Als Ausdrücke werden
immer XPath-Ausdrücke erwartet, welche Positionen angeben oder XML-Fragmente
bzw. Textknoten enthalten.
-- Einfügen
insert Expression1 (
{as first | as last}
into | after | before
Expression2 )
-- Löschen
delete Expression
-- Ersetzen
replace value of Expression1 with Expression2
Im nachfolgenden Beispiel gibt es verschiedene Einfügevorgänge. Dabei
ist immer zu beachten, welcher Inhalt (Knoten, Fragment, Text) an welche Stelle
(Reihenfolge, Textknoten) eingefügt werden soll. Für die Adressierung
verwendet man immer einen XPath-Filter, der auf eine Position prüft, um
tatsächlich einen einzigen Ort zu adressieren, an dem die Inhalte eingefügt
werden können.
-- Price-Element nach Name einfügen
SET @resultXML.modify(
'insert <Prices></Prices> as last
into (//Product)[1]')
-- Standard als erstes Kind in Prices einfügen
SET @resultXML.modify(
'insert <Standard>343.6496</Standard>
into (//Product/Prices)[1]')
-- List nach Standard einfügen
SET @resultXML.modify(
'insert <List>343.6496</List> after
(//Product/Prices/Standard)[1]')
-- Details nach Prices einfügen
SET @resultXML.modify(
'insert <Details></Details> after
(//Product/Prices)[1]')
-- Color in Details einfügen
SET @resultXML.modify(
'insert <Color>Black</Color>
into (//Product/Details)[1]')
-- Size vor Color einfügen
SET @resultXML.modify(
'insert <Size>52</Size> before
(//Product/Details/Color)[1]')
Im Gegensatz zum Einfügen verhält sich die Arbeit mit dem delete-Schlüsselwort
wesentlich einfacher. Hier muss lediglich der zu löschende Bereich adressiert
werden, wozu ein XPath-Ausdruck zum Einsatz kommt. Ansonsten ist nicht viel
mehr zu tun, denn alles, was der XPath-Ausdruck bei einem einfachen Test desselben
findet, wird vollständig gelöscht. Dies wirkt sich nicht nur auf
einen einzelnen Knoten aus, sondern auch auf an verschiedenen Orten im Dokument
gefundenen Knoten.
-- Element löschen
SET @resultXML.modify('
delete (//Product[1]/Details/Color)')
-- Teilbaum löschen
SET @resultXML.modify('
delete (//Product[1]/Prices)')
-- Textknoten löschen
SET @resultXML.modify('
delete (//Product[1]/Details/Size/text())')
Mit Hilfe der replace-Anweisung lassen sich nur einfache Werte ersetzen und
keine Fragmente einfügen. Dies ist aber auch nicht weiter tragisch, da
man in diesem Fall auch eine Kombination aus einem Lösch- und einem Ersetzungsvorgang
verwenden kann. Daher ist das nachfolgende Beispiel im Vergleich zu den vorherigen
besonders kurz, da aus einem schwarzen nur ein Produkt in Orange wird. Allerdings
fällt dieser Trick spätestens beim Namen auf, den man nur mit der
substring()-Funktion aus XPath bearbeiten könnte.
XML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum BremenXML Consulting MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik SQL XML Reporting Intelligence Services Microsoft MS Server Bücher Business Webservices Analysis T-SQL .NET Dortmund Hagen München Recklinghausen Hamm Frankfurt Hannover Duisburg Düsseldorf Leipzig Stuttgart Dresden Krefeld Hamburg Mönchen-Gladbach Köln Mülheim Berlin Herne Bonn Essen Bochum Bremen |