TSQL Shred XML - это правильно или есть лучший способ (новичок @ shredding xml)

StackOverflow https://stackoverflow.com/questions/2992903

Вопрос

Хорошо, я - C# asp.net dev следующим образом: Заказы должны взять заданный набор данных, измельчить XML и возвращать столбцы. Я утверждал, что легче сделать измельчение на стороне ASP.NET, где у нас уже есть доступ к таким вещам, как Deserializers и т. Д., И весь комплекс известных типов, но нет, босс говорит: «Измельчите его на сервере, Верните набор данных, свяжите набор данных с столбцами Gridview », так что пока я делаю то, что мне сказали. Это все, чтобы отвлечься от людей, которые придут вместе и скажут «плохие требования».

Задача под рукой:

Вот мой код, который работает и делает то, что я хочу:

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 Чтобы согласиться с этим ...)

Это было полезно?

Решение

Независимо от того, что измельчение XML на сервере, а не в том, чтобы сделать это на клиенте, хорошо или плохо, зависит от множества факторов, требования могут быть совершенно действительными. Измельчение XML на сервере, учитывая обширную поддержку SQL Server 2005 и после того, как есть для XML (XPath/Xquery/XML -индексы) часто является очень разумным подходом.

Однако то, что у вас есть в своем посте, является примером семантического моделирования данных, используя XML. Я рекомендую вам пройти пару белых бумаг:

Я не знаю, является ли @table1 в вашем примере лишь примером или фактической структурой данных, которую вы используете в производстве, но некоторые моменты будут выскочить сразу после прочтения этих документов:

  • Используйте типизированный XML, когда это возможно (добавьте схему)
  • Используйте соответствующий индекс XML для необходимой вам обработки
  • Попробуйте измельчить весь XML в одном преобразовании вместо 3 последовательных шагов

И, наконец, если вам нужно разбить каждый Время, когда вы запрашиваете, возможно, вам нужно проанализировать модель данных (здесь полезна первая статья в моем списке).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top