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 ...)

War es hilfreich?

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:

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top