【问题标题】:How can I return the content of an XML field as a recordset?如何将 XML 字段的内容作为记录集返回?
【发布时间】:2010-09-10 06:32:41
【问题描述】:

假设我有这张表(SQL Server 2005):

Id => integer  
MyField => XML

Id MyField

1   < Object>< Type>AAA< /Type>< Value>10< /Value>< /Object>< Object>< Type>BBB< /Type><Value>20< /Value>< /Object>  
2   < Object>< Type>AAA< /Type>< Value>15< /Value>< /Object>  
3   < Object>< Type>AAA< /Type>< Value>20< /Value>< /Object>< Object>< Type>BBB< /Type>< Value>30< /Value>< /Object>  

我需要一个 TSQL 查询,它会返回如下内容:

Id  AAA     BBB  
1   10      20  
2   15      NULL  
3   20      30  

请注意,我不知道 xml 字符串中是否会提前有多少个'Type'(例如 AAA、BBB、CCC、DDD 等)。

【问题讨论】:

  • 请注意,我不知道 xml 字符串中是否提前有多少 'Type'(例如 AAA、BBB、CCC、DDD 等)。
  • 您很可能必须使用动态 sql 和游标。没有单一的陈述可以得到你想要的我不认为。

标签: sql xml


【解决方案1】:

您需要使用XML querying in sql server 来执行此操作。

类似的东西

select id, MyField.query('/Object/Type[.="AAA"]/Value') as AAA, MyField.query('/Object/Type[.="BBB"]/Value) AS BBB

不确定这是否是 100% 正确的 xquery 语法,但它会是这样的。

【讨论】:

    【解决方案2】:

    一种可能的选择是使用XMLDataDocument。使用此类,您可以检索数据,因为 XML 将其加载到 XmlDataDocument 中,然后使用 Dataset 属性访问它,就像它是标准数据集一样。

    【讨论】:

      【解决方案3】:

      您需要使用CROSS APPLY。以下是根据您的要求提供的示例:

      declare @y table (rowid int, xmlblock xml)
      insert into @y values(1,'<Object><Type>AAA</Type><Value>10</Value></Object><Object><Type>BBB</Type><Value>20</Value></Object>')
      insert into @y values(2,'<Object><Type>AAA</Type><Value>15</Value></Object>')
      insert into @y values(3,'<Object><Type>AAA</Type><Value>20</Value></Object><Object><Type>BBB</Type><Value>30</Value></Object>')
      
      select y.rowid, t.b.value('Type[1]', 'nvarchar(5)'), t.b.value('Value[1]', 'int')
      from @y y  CROSS APPLY  XmlBlock.nodes('//Object') t(b)
      

      哦,您的示例 XML 无效,第一行缺少 Type BBB 的开头 Value 元素。

      【讨论】:

        猜你喜欢
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多