TSQL分解XML——这是正确的还是有更好的方法(newbie@shreading XML)

TSQL分解XML——这是正确的还是有更好的方法(newbie@shreading XML),sql,xml,tsql,sql-server-2008,shred,Sql,Xml,Tsql,Sql Server 2008,Shred,好的,我是一名C#ASP.NET开发人员,执行以下命令:获取给定的数据集,分解XML并返回列。我认为,在ASP.NET端进行分解比较容易,因为我们已经可以访问反序列化程序等,以及整个已知类型的复合体,但是没有,老板说“在服务器上分解,返回一个数据集,将数据集绑定到gridview的列上”,所以现在,我正在做我被告知的事情。这一切都是为了阻止那些会说“糟糕的需求”的人 手头的任务: 以下是我的代码,它可以工作并实现我想要的功能: DECLARE @table1 AS TABLE ( Pro

好的,我是一名C#ASP.NET开发人员,执行以下命令:获取给定的数据集,分解XML并返回列。我认为,在ASP.NET端进行分解比较容易,因为我们已经可以访问反序列化程序等,以及整个已知类型的复合体,但是没有,老板说“在服务器上分解,返回一个数据集,将数据集绑定到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)
将@table1声明为TABLE(
ProductID VARCHAR(10)
,姓名VARCHAR(20)
,Color VARCHAR(20)
,用户输入的VARCHAR(20)
,XmlField-XML
)
在@table1中选择“12345”、“ball”、“red”、“john”、“1020”
在@table1中插入选择“12346”、“ball”、“blue”、“adam”和“1225”
在@table1中插入选择“12347”、“ring”、“red”、“john”和“58”
在@table1中插入选择“12348”、“环”、“蓝”、“亚当”、“810”

插入到@table1中,选择“23456”、“auto”、“black”、“ann”,以配合此操作……

在服务器上分解XML而不是在客户端分解XML是好是坏取决于多种因素,这些要求可能完全有效。考虑到SQLServer2005及其后版本对XML(XPath/XQuery/XML索引)的广泛支持,在服务器上分解XML通常是一种非常明智的方法

然而,您在文章中看到的是一个使用XML对数据进行语义建模的示例。我建议您阅读几份白皮书:

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

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

最后,如果你每次查询都需要切碎数据,也许你需要分析数据模型(这是我列表中第一篇论文的有用之处)。

@Matti Virkkunen~有消息告诉我,你只是想抓住这个机会:p~我已经尝试过了,现在我只能听天由命地去做他要求的事情。~awww废话,我把我的评论抹掉了。Grrrr。我以为我把它贴在这里了。我看到了你的PDQ答案,没法回复。上面的“模式”对于政府工作来说已经足够接近了,但显然并不准确。其思想是公共列是一致的,XML通常是自定义业务对象的数组,但它们的类型不一致。这样做的目的是为了减少用于日志记录的表的数量/类型,同时仍然允许在存储内容上有一点自由。我一定会阅读那些张贴的链接。让我仔细考虑一下“回答”?再次感谢!