Domanda

Ok, io sono un C # ASP.NET dev seguenti ordini: Gli ordini sono di prendere un determinato insieme di dati, sminuzzare le colonne XML e ritorno. Ho sostenuto che è più facile fare la triturazione sul lato ASP.NET dove abbiamo già l'accesso a cose come deserializzatore, ecc, e l'intero complesso dei tipi conosciuti, ma no, il capo dice "brandello sul server, restituire un set di dati, si legano il set di dati alle colonne di GridView" quindi per ora, sto facendo quello che mi è stato detto. Questo è tutto per scongiurare la gente che verrà lungo e dire "requisiti cattivi".

Compito a portata di mano:

Ecco il mio codice che funziona e fa quello che voglio che:

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)

Quindi per ora, sto cercando di capire se c'è un modo migliore per scrivere il codice di quello che sto facendo ora ... (ho un parte 2 di andare avanti con questo ...)

È stato utile?

Soluzione

Se la triturazione XML sul server al contrario di farlo sul client è buono o cattivo dipende da una varietà di fattori, i requisiti possono essere perfettamente valido. Triturazione XML sul server, data server SQL ampio supporto 2005 e dopo avere per XML (XPath indici / XQuery / XML) è spesso un approccio molto sensato.

Tuttavia, quello che hai nel tuo post è un esempio di modellazione semantica dei dati, utilizzando XML. Vi consiglio di andare su un paio di libri bianchi:

Non so se il @ table1 nel tuo esempio è solo un esempio o la struttura dati effettivi si utilizza in produzione, ma alcuni punti salterà fuori subito dopo aver letto quelle carte:

  • uso digitato XML quando possibile (aggiungere uno schema)
  • utilizzare un indice XML appropriato per il trattamento è necessario
  • cercare di distruggere tutte XML in un'unica trasformazione invece di 3 fasi consecutive

E, infine, se hai bisogno di straccio tutti volta che si domanda, forse avete bisogno di analizzare il modello di dati (questo è dove il primo articolo nella mia lista è utile).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top