TSQL SHRED XML - Ist das richtig oder gibt es einen besseren Weg (Neuling @ Shredding XML)
-
24-10-2019 - |
Frage
OK, ich bin ein C# ASP.NET -Entwickler, das nach Bestellungen beauftragt ist: Die Bestellungen sollen einen bestimmten Datensatz entgegennehmen, die XML -Spalten zerkleinern und Spalten zurückgeben. Ich habe argumentiert, dass es einfacher ist, das Shredding auf der ASP.NET -Seite zu erledigen, wo wir bereits Zugriff auf Dinge wie Deserializer usw. und den gesamten Komplex bekannter Typen haben, aber nein, der Chef sagt: " Gibt einen Datensatz zurück, binden Sie den Datensatz an die Spalten der Gridview ", also mache ich vorerst das, was mir gesagt wurde. Dies ist alles, um sich von den Leuten zu bewegt, die mitkommen und "schlechte Anforderungen" sagen.
Aufgabe zur Hand:
Hier ist mein Code, der funktioniert und tut, was ich möchte, dass er es will:
DECLARE @table1 AS TABLE (
ProductID VARCHAR(10)
, Name VARCHAR(20)
, Color VARCHAR(20)
, UserEntered VARCHAR(20)
, XmlField XML
)
INSERT INTO @table1 SELECT '12345','ball','red','john','<sizes><size name="medium"><price>10</price></size><size name="large"><price>20</price></size></sizes>'
INSERT INTO @table1 SELECT '12346','ball','blue','adam','<sizes><size name="medium"><price>12</price></size><size name="large"><price>25</price></size></sizes>'
INSERT INTO @table1 SELECT '12347','ring','red','john','<sizes><size name="medium"><price>5</price></size><size name="large"><price>8</price></size></sizes>'
INSERT INTO @table1 SELECT '12348','ring','blue','adam','<sizes><size name="medium"><price>8</price></size><size name="large"><price>10</price></size></sizes>'
INSERT INTO @table1 SELECT '23456','auto','black','ann','<auto><type>car</type><wheels>4</wheels><doors>4</doors><cylinders>3</cylinders></auto>'
INSERT INTO @table1 SELECT '23457','auto','black','ann','<auto><type>truck</type><wheels>4</wheels><doors>2</doors><cylinders>8</cylinders></auto><auto><type>car</type><wheels>4</wheels><doors>4</doors><cylinders>6</cylinders></auto>'
DECLARE @x XML
SELECT @x = (
SELECT
ProductID
, Name
, Color
, UserEntered
, XmlField.query('
for $vehicle in //auto
return <auto
type = "{$vehicle/type}"
wheels = "{$vehicle/wheels}"
doors = "{$vehicle/doors}"
cylinders = "{$vehicle/cylinders}"
/>')
FROM @table1 table1
WHERE Name = 'auto'
FOR XML AUTO
)
SELECT @x
SELECT
ProductID = T.Item.value('../@ProductID', 'varchar(10)')
, Name = T.Item.value('../@Name', 'varchar(20)')
, Color = T.Item.value('../@Color', 'varchar(20)')
, UserEntered = T.Item.value('../@UserEntered', 'varchar(20)')
, VType = T.Item.value('@type' , 'varchar(10)')
, Wheels = T.Item.value('@wheels', 'varchar(2)')
, Doors = T.Item.value('@doors', 'varchar(2)')
, Cylinders = T.Item.value('@cylinders', 'varchar(2)')
FROM @x.nodes('//table1/auto') AS T(Item)
SELECT @x = (
SELECT
ProductID
, Name
, Color
, UserEntered
, XmlField.query('
for $object in //sizes/size
return <size
name = "{$object/@name}"
price = "{$object/price}"
/>')
FROM @table1 table1
WHERE Name IN ('ring', 'ball')
FOR XML AUTO
)
SELECT @x
SELECT
ProductID = T.Item.value('../@ProductID', 'varchar(10)')
, Name = T.Item.value('../@Name', 'varchar(20)')
, Color = T.Item.value('../@Color', 'varchar(20)')
, UserEntered = T.Item.value('../@UserEntered', 'varchar(20)')
, SubName = T.Item.value('@name' , 'varchar(10)')
, Price = T.Item.value('@price', 'varchar(2)')
FROM @x.nodes('//table1/size') AS T(Item)
Ich versuche vorerst herauszufinden, ob es eine bessere Möglichkeit gibt, den Code zu schreiben als das, was ich jetzt mache ... (Ich habe eine Teil 2 mit diesem einhergehen ...)
Lösung
Unabhängig davon, ob das Zerkleinern des XML auf dem Server als dies im Client gut oder schlecht ist, hängt von einer Vielzahl von Faktoren ab, die Anforderungen können perfekt gültig sein. Shredding XML auf dem Server, angesichts der umfangreichen Unterstützung SQL Server 2005 und nach HAUS für XML (XPath/XQuery/XML -Indizes) ist häufig ein sehr vernünftiger Ansatz.
Was Sie in Ihrem Beitrag jedoch haben, ist jedoch ein Beispiel für die semantische Modellierung von Daten unter Verwendung von XML. Ich empfehle Ihnen, ein paar White Papers zu durchgehen:
- Best Practices für die semantische Datenmodellierung für Leistung und Skalierbarkeit
- XML Best Practices für Microsoft SQL Server 2005
- Leistungsoptimierungen für den XML -Datentyp in SQL Server 2005
- Leistungstipps zur Verwendung von XML -Daten auf SQL Server
Ich weiß nicht, ob das @Tabelle1 in Ihrem Beispiel nur ein Beispiel oder die tatsächliche Datenstruktur ist, die Sie in der Produktion verwenden, aber einige Punkte werden sofort nach dem Lesen der folgenden Zeitungen aussteigen:
- Verwenden Sie nach Möglichkeit typisierte XML (fügen Sie ein Schema hinzu)
- Verwenden Sie einen geeigneten XML -Index für die benötigte Verarbeitung, die Sie benötigen
- Versuchen Sie, alle XML in einer einzigen Transformation anstelle von 3 aufeinanderfolgenden Schritten zu zerkleinern
Und schließlich, wenn Sie zerkleinern müssen jeder Wenn Sie abfragen, müssen Sie das Datenmodell analysieren (hier ist das erste Papier in meiner Liste nützlich).