TSQL Shred XML - Questo è giusto o c'è un modo migliore (newbie @ triturazione XML)
-
24-10-2019 - |
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 ...)
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:
- noreferrer Best Practices per il Semantic modellazione dei dati di prestazioni e scalabilità
- XML Procedure consigliate per Microsoft SQL Server 2005
- prestazioni ottimizzazioni per il tipo di dati XML in SQL Server 2005
- punte prestazioni nella utilizzando i dati XML in SQL Server
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).