首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL分解XML -这是正确的,还是有更好的方法(newbie @ shredding XML)

TSQL分解XML -这是正确的,还是有更好的方法(newbie @ shredding XML)
EN

Stack Overflow用户
提问于 2010-06-08 04:28:42
回答 1查看 1.5K关注 0票数 0

好的,我是一名C# ASP.NET开发人员,顺序如下:获取给定的数据集,分解XML列和返回列。我认为在ASP.NET端进行分解会更容易,因为我们已经可以访问反序列化程序等东西,以及整个复杂的已知类型,但是不,老板说“在服务器上分解它,返回一个数据集,将数据集绑定到网格视图的列”,所以现在,我要做的是我被告知的事情。这一切都是为了阻止那些会说“坏需求”的人。

手头的任务:

下面是我的代码,它可以正常工作,并且可以做我想让它做的事情:

代码语言:javascript
复制
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)

所以现在,我想知道是否有比我现在所做的更好的方式来编写代码。(我有一个part 2来配合这个……)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-08 04:41:33

在服务器上分解XML而不是在客户机上分解XML是好是坏取决于各种因素,这些要求可能是完全有效的。在服务器上分解XML通常是一种非常明智的方法,因为SQL server 2005和have for XML (XPath/XQuery/XML索引)提供了广泛的支持。

然而,您在帖子中使用的是一个使用XML的数据语义建模的示例。我建议你看几份白皮书:

  • Best Practices for Semantic Data Modeling for Performance and Scalability
  • XML Best Practices for Microsoft SQL Server 2005
  • Performance Optimizations for the XML Data Type in SQL Server 2005
  • Performance tips of using XML data in SQL Server

我不知道你的例子中的@table1只是一个例子,还是你在生产中使用的实际数据结构,但在你读完这些论文后,一些要点会立即浮现出来:

  • 尽可能使用类型化XML (添加架构)
  • 使用适当的XML索引进行所需的处理
  • 尝试在一次转换中分解所有XML,而不是连续的3个步骤

最后,如果您需要在每次查询时进行分解,那么您可能需要分析数据模型(这就是我的列表中的第一篇论文的用处)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2992903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档