好的,我是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通常是一种非常明智的方法。

但是,您在帖子中拥有的是使用XML的语义建模的一个示例。我建议您浏览几张白皮书:

我不知道您的示例中的 @table1只是一个示例还是您在生产中使用的实际数据结构,但是在阅读这些论文后,有些要点会立即跳出:

  • 尽可能使用键入的XML(添加模式)
  • 使用适当的XML索引进行所需的处理
  • 尝试将所有XML切成一个单一转换而不是连续3个步骤

最后,如果您需要切碎 每一个 您查询的时间,也许您需要分析数据模型(这是我列表中的第一篇论文有用的地方)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top