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

Était-ce utile?

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:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top