【问题标题】:Selecting XML nodes with SQL Server使用 SQL Server 选择 XML 节点
【发布时间】:2019-08-12 23:10:36
【问题描述】:

我的 XMLData 存储在 table.[column] 下:dbo.promotions.[PromotionDiscountData] 当我展开它时,XML 如下所示:

<ArrayOfPromotionDiscountBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PromotionDiscountBase xsi:type="OrderPromotionDiscount">
    <DiscountType>Fixed</DiscountType>
    <DiscountAmount>5.0000</DiscountAmount>
  </PromotionDiscountBase>
</ArrayOfPromotionDiscountBase>

我想导出报告并将 xml 展平为一列,其中包含 dbo.promotions 表中的所有其他内容。 从 xml 中获取 DiscountType 和 DiscountAmount 的最佳方法是什么?

谢谢!

【问题讨论】:

  • 使用 XQUERY。到目前为止,您尝试了哪些方法,为什么没有成功?

标签: sql sql-server xml


【解决方案1】:

请尝试以下方法。

SQL

-- DDL and data population, start
DECLARE @tbl TABLE (ID INT IDENTITY(1,1) PRIMARY KEY,[xmlData] XML NOT NULL);

INSERT INTO @tbl([xmlData])
VALUES 
(N'<ArrayOfPromotionDiscountBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PromotionDiscountBase xsi:type="OrderPromotionDiscount">
    <DiscountType>Fixed</DiscountType>
    <DiscountAmount>5.0000</DiscountAmount>
  </PromotionDiscountBase>
</ArrayOfPromotionDiscountBase>');
-- DDL and data population, end

SELECT ID
    , col.value('(DiscountType)[1]', 'VARCHAR(30)') AS [DiscountType]
    , col.value('(DiscountAmount)[1]', 'DECIMAL(10,4)') AS [DiscountAmount]
FROM @tbl AS tbl
      CROSS APPLY tbl.[xmlData].nodes('/ArrayOfPromotionDiscountBase/PromotionDiscountBase') AS tab(col);

【讨论】:

  • 我推荐使用value在SQL Server中查询XML时使用text属性;我不记得确切的原因,但它确实有性能优势。
  • 谢谢!有了这个 xquery,我发现我之前的尝试做错了什么!感谢您的大力帮助!
  • 如果 XML 不包含重复元素,则使用 (/ArrayOfPromotionDiscountBase/PromotionDiscountBase/DiscountType/text())[1] 并为所有需要的元素重复此操作会提高性能。虽然这样读会更好....nodes() 将不得不创建一个派生集,这在这里并不真正需要,而且这是一个相当繁重的操作...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
相关资源
最近更新 更多