TSQL Shred XML - ¿Es esto correcto o hay una mejor manera (Newbie @ Shredding XML)
-
24-10-2019 - |
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 ...)
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:
- Las mejores prácticas para el modelado de datos semánticos para el rendimiento y la escalabilidad
- Las mejores prácticas de XML para Microsoft SQL Server 2005
- Optimizaciones de rendimiento para el tipo de datos XML en SQL Server 2005
- Consejos de rendimiento del uso de datos XML en SQL Server
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).