Pregunta

Ok, soy un C# ASP.NET Dev Ordenes: los pedidos deben tomar un conjunto de datos determinado, triturar el XML y devolver las columnas. He argumentado que es más fácil hacer la trituración en el lado de ASP.NET, donde ya tenemos acceso a cosas como deserializadores, etc., y todo el complejo de tipos conocidos, pero no, el jefe dice "triturarlo en el servidor, Devuelva un conjunto de datos, vincule el conjunto de datos a las columnas de la vista de gridview "Así que por ahora, estoy haciendo lo que me dijeron. Todo esto es para evitar a la gente que vendrá y dirá "malos requisitos".

Tarea en cuestión:

Aquí está mi código que funciona y hace lo que quiero:

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)

Entonces, por ahora, estoy tratando de averiguar si hay una mejor manera de escribir el código de lo que estoy haciendo ahora ... (tengo un parte 2 para ir con este ...)

¿Fue útil?

Solución

Si triturar el XML en el servidor en lugar de hacerlo en el cliente es bueno o malo depende de una variedad de factores, los requisitos pueden ser perfectamente válidos. Threding XML en el servidor, dado el amplio soporte SQL Server 2005 y después de tener para XML (XPATH/XQuery/XML índices) es a menudo un enfoque muy sensato.

Sin embargo, lo que tiene en su publicación es un ejemplo de modelado semántico de datos, utilizando XML. Te recomiendo que repases un par de papeles blancos:

No sé si el @Tabla1 en su ejemplo es solo un ejemplo o la estructura de datos real que usa en la producción, pero algunos puntos saltarán inmediatamente después de leer esos documentos:

  • Use XML mecanografiado cuando sea posible (agregue un esquema)
  • Use un índice XML apropiado para el procesamiento que necesita
  • Intente triturar todo el XML en una sola transformación en lugar de 3 pasos consecutivos

Y finalmente, si necesitas triturar cada tiempo que consulta, tal vez necesite analizar el modelo de datos (aquí es donde es útil el primer artículo de mi lista).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top