【问题标题】:XML Multiple nodes with same name but different attributes SQLXML 同名但属性不同的多个节点 SQL
【发布时间】:2020-09-22 19:22:12
【问题描述】:

我想返回 PackageUOM 为“EA”的维度。目前,我只获取第一个子节点,这会导致问题!

我知道我只想在 PackageUOM 是 EA 时提取尺寸,但我不知道该怎么做。任何帮助,将不胜感激。谢谢。

供参考,这是在 SQL 2014 中

<Packages>
        <Package MaintenanceType="A">
          <PackageUOM>PL</PackageUOM>
          <QuantityofEaches>50</QuantityofEaches>
          <Orderable>Y</Orderable>
          <Dimensions UOM="IN">
            <Height>40.7500</Height>
            <Width>42.0000</Width>
            <Length>48.0000</Length>
          </Dimensions>
        </Package>
        <Package MaintenanceType="A">
          <PackageUOM>EA</PackageUOM>
          <QuantityofEaches>1</QuantityofEaches>
          <Orderable>Y</Orderable>
          <Dimensions UOM="IN">
            <Height>7.2500</Height>
            <Width>17.0000</Width>
            <Length>10.2500</Length>
          </Dimensions>
          <Weights UOM="PG">
            <Weight>8.8400</Weight>
          </Weights>
        </Package>
      </Packages>


SELECT *
    FROM OPENXML(@handle, 'a:PIES/a:Items/a:Item',2)
    WITH (
        [TestFile] varchar(max) '../../a:TestFile',
        [PIESVersion] varchar(max) '../../a:Header/a:PIESVersion',
        [SubmissionType] varchar(max) '../../a:Header/a:SubmissionType',
        [LanguageCode] varchar(max) '../../a:Header/a:LanguageCode',
        [TechnicalContact] varchar(max) '../../a:Header/a:TechnicalContact',
        [ContactEmail] varchar(max) '../../a:Header/a:ContactEmail',
        [PCdbVersionDate] varchar(max) '../../a:Header/a:PCdbVersionDate',
        [PAdbVersionDate] varchar(max) '../../a:Header/a:PAdbVersionDate',
        [ItemLevelGTIN] varchar(max) 'a:ItemLevelGTIN',
        [PartNumber] varchar(max) 'a:PartNumber',
        [BrandAAIAID] varchar(max) 'a:BrandAAIAID',
        [BrandLabel] varchar(max) 'a:BrandLabel',
        [SubBrandAAIAID] varchar(max) 'a:SubBrandAAIAID',
        [SubBrandLabel] varchar(max) 'a:SubBrandLabel',
        [PartTerminologyID] varchar(max) 'a:PartTerminologyID',
        [PackageUOM] varchar(max) 'a:Packages/a:Package/a:PackageUOM',
        [PackageQuantityofEaches] varchar(max) 'a:Packages/a:Package/a:QuantityofEaches',
        [PackageDimensionUOM] varchar(10) 'a:Packages/a:Package/a:Dimensions/@UOM',
        [PackageHeight] decimal(9,4) 'a:Packages/a:Package/a:Dimensions/a:Height',
        [PackageWidth] decimal(9,4) 'a:Packages/a:Package/a:Dimensions/a:Width',
        [PackageLength] decimal(9,4) 'a:Packages/a:Package/a:Dimensions/a:Length',
        [PackageWeightUOM] varchar(max) 'a:Packages/a:Package/a:Weights/@UOM',
        [PackageWeight] decimal(9,4) 'a:Packages/a:Package/a:Weights/a:Weight',
        [PackageUPC] varchar(max) 'a:Packages/a:Package/a:PackageLevelGTIN'     
    ) A
    WHERE A.[PartNumber]='OW7168'

【问题讨论】:

  • PSA,在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑,你的代码尝试实现它。 (3) 基于上述#1 中的样本数据的期望输出。 (4) 你的 SQL Server 版本 (SELECT @@version;)
  • PSA,请提供我之前提到的内容。您的 SELECT 语句与 XML 结构不匹配。

标签: sql-server xml tsql xquery sql-server-2014


【解决方案1】:

您是否正在寻找类似以下的内容?

Declare @x xml = '<Packages>
        <Package MaintenanceType="A">
          <PackageUOM>PL</PackageUOM>
          <QuantityofEaches>50</QuantityofEaches>
          <Orderable>Y</Orderable>
          <Dimensions UOM="IN">
            <Height>40.7500</Height>
            <Width>42.0000</Width>
            <Length>48.0000</Length>
          </Dimensions>
        </Package>
        <Package MaintenanceType="A">
          <PackageUOM>EA</PackageUOM>
          <QuantityofEaches>1</QuantityofEaches>
          <Orderable>Y</Orderable>
          <Dimensions UOM="IN">
            <Height>7.2500</Height>
            <Width>17.0000</Width>
            <Length>10.2500</Length>
          </Dimensions>
          <Weights UOM="PG">
            <Weight>8.8400</Weight>
          </Weights>
        </Package>
      </Packages>'

select node.value('(Dimensions/Height/text())[1]', 'VARCHAR(20)') AS [Height],
       node.value('(Dimensions/Width/text())[1]', 'VARCHAR(20)') AS [Width],
       node.value('(Dimensions/Length/text())[1]', 'VARCHAR(20)') AS [Length]
from @x.nodes('/Packages/Package[PackageUOM/text() = "EA"]') AS nodes(node);

在此您将获得为PackageUOM = 'EA' 过滤的数据 并将该记录的维度设为 3 列

另外请注意,我使用了“VARCHAR(20)”而不是“DECIMAL(18,4)”,以避免由于任何非数字数据作为米左右的测量单位而崩溃。

【讨论】:

  • 有没有办法使用 OpenXML 做到这一点?
  • @PSA,OpenXML 是较旧的方式,而且也很长。如果这对您有帮助,请将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多