TSQL Shred XML - Est-ce vrai ou est-il une meilleure façon (débutant @ déchiqueter XML)
-
24-10-2019 - |
Question
Ok, je suis un C # ASP.NET dev commandes suivantes: Les commandes doivent prendre un ensemble de données, déchiqueter les colonnes XML et retour. Je l'ai soutenu qu'il est plus facile de faire le déchiqueter du côté ASP.NET où nous avons déjà accès à des choses comme désérialiseurs, etc, et l'ensemble du complexe des types connus, mais non, le patron dit « déchiqueter sur le serveur, retourner un ensemble de données, lient l'ensemble de données sur les colonnes du gridview » pour l'instant, je fais ce qu'on m'a dit. Tout cela est à la tête au large des gens qui vont venir le long et dire « mauvaises conditions ».
tâche:
Voici mon code qui fonctionne et fait ce que je veux à:
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)
Pour l'instant, je suis en train de déterminer s'il y a une meilleure façon d'écrire le code que ce que je fais maintenant ... (j'ai partie 2 pour aller avec celui-ci ...)
La solution
Que déchiqueter le XML sur le serveur par opposition à le faire sur le client est bon ou mauvais dépend de divers facteurs, les exigences peuvent être parfaitement valides. Déchiqueter XML sur le serveur, étant donné le support étendu SQL Server 2005 et après avoir pour XPath (XML / XQuery / des index XML) est souvent une approche très sensible.
Cependant, ce que vous avez dans votre post est un exemple de modélisation sémantique des données, en utilisant XML. Je vous conseille d'aller sur deux livres blancs:
- noreferrer les meilleures pratiques pour la modélisation des données sémantique pour la performance et Evolutivité
- XML Meilleures pratiques pour Microsoft SQL Server 2005
- Performance Optimisations pour le type de données XML dans SQL Server 2005
- Conseils sur les performances de l'utilisation des données XML dans SQL Server
Je ne sais pas si le tableau 1 @ dans votre exemple est juste un exemple ou la structure de données réelles que vous utilisez dans la production, mais certains points sautera immédiatement après avoir lu ces documents:
- utilisation typée XML lorsque cela est possible (ajouter un schéma)
- utiliser un index XML approprié pour le traitement dont vous avez besoin
- essayer de déchiqueter tout XML en une seule transformation au lieu de 3 étapes consécutives
Et enfin, si vous avez besoin de déchiqueter à chaque fois requête, peut-être vous avez besoin d'analyser le modèle de données (ce qui est là le premier papier dans ma liste est utile).