TSQL Shred XML - это правильно или есть лучший способ (newbie @ shredding XML)
Хорошо, я разработчик C# ASP.NET следующих порядков: Заказы должны взять заданный набор данных, уничтожить XML и вернуть столбцы. Я утверждал, что проще выполнять измельчение на стороне ASP.NET, где у нас уже есть доступ к таким вещам, как десериализаторы и т. Д., И ко всему комплексу известных типов, но нет, говорит босс: "уничтожьте это на сервере, верните набор данных, свяжите набор данных со столбцами вида сетки, так что пока я делаю то, что мне сказали. Это все, чтобы отогнать людей, которые придут и скажут "плохие требования".
Задача под рукой:
Вот мой код, который работает и делает то, что я хочу:
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)
Итак, сейчас я пытаюсь выяснить, есть ли лучший способ написать код, чем то, что я делаю сейчас... (У меня есть часть 2, чтобы согласиться с этим...)
1 ответ
Хорошее или плохое уничтожение XML на сервере, а не на клиенте, зависит от множества факторов, требования могут быть совершенно обоснованными. Измельчение XML на сервере, учитывая обширную поддержку SQL Server 2005 и более поздних версий для XML (индексы XPath/XQuery/XML), часто является очень разумным подходом.
Однако то, что вы имеете в своем посте, является примером семантического моделирования данных с использованием XML. Я рекомендую вам ознакомиться с несколькими документами:
- Лучшие практики для семантического моделирования данных для повышения производительности и масштабируемости
- XML Best Practices для Microsoft SQL Server 2005
- Оптимизация производительности для типа данных XML в SQL Server 2005
- Советы по повышению эффективности использования данных XML в SQL Server
Я не знаю, является ли @ table1 в вашем примере просто примером или фактической структурой данных, которую вы используете в производстве, но некоторые моменты выскочат сразу после того, как вы прочитаете эти статьи:
- по возможности используйте типизированный XML (добавьте схему)
- используйте соответствующий XML-индекс для необходимой вам обработки
- попытаться уничтожить весь XML за одно преобразование вместо 3 последовательных шагов
И, наконец, если вам нужно измельчать каждый раз, когда вы делаете запрос, возможно, вам нужно проанализировать модель данных (именно здесь полезна первая статья в моем списке).