【问题标题】:T SQL how to add extra elements in xmlT SQL如何在xml中添加额外的元素
【发布时间】:2023-03-28 07:25:01
【问题描述】:

您好,我正在尝试从我的 t sql 查询生成 xml。但我在我的 xml 中添加额外元素时遇到问题。或者甚至有可能做到这一点。我的sql查询是这样的。

    SELECT 
        m.DeviceId as IndividualItemNo,
        Name = 'B',
        w.BTime as Value,
        CAST(CONVERT(VARCHAR(8), w.EndTS, 112) AS INT) AS [Date], 
        CONVERT(VARCHAR(5), w.EndTS,108) + '+0000' AS [Time],
        g.GroupName
    FROM Machine m
        INNER JOIN [Group] g ON m.GroupId = g.GroupId
        INNER JOIN [EDWCompany] e ON g.CompanyKey = e.CompanyKey
        LEFT JOIN WorkingPass w ON m.MachineId = w.MachineId and w.WorkingPassId = (SELECT MAX(w.WorkingPassId) FROM WorkingPass w WHERE MachineId = m.MachineId )
    WHERE g.CompanyKey = 105
    GROUP BY  m.DeviceId, w.EndTS , w.BTime , g.GroupName, e.CompanyNo, m.MachineId
    ORDER BY m.DeviceId 
    FOR XML PATH ('IndividualItem'), ROOT ('IndividualItem_Report'), ELEMENTS

我的 XML 结果:

<IndividualItem_Report>
  <IndividualItem>
    <IndividualItemNo>027FDF3014953</IndividualItemNo>
    <Name>B</Name>
    <Value>3535</Value>
    <Date>20130221</Date>
    <Time>10:32+0000</Time>
    <GroupName>TARKETT AB</GroupName>
  </IndividualItem>
</IndividualItem_Report>

但我想添加额外的元素。所以这就是我想要的。

<IndividualItem_Report>
    <IndividualItem>
        <IndividualItemNo>027FDF3014953</IndividualItemNo>
        <HourMeterList>
            <HourMeter>
                <Name>B</Name>
                <Value>3535</Value>
                <Date>20130221</Date>
                <Time>10:32+0000</Time>
                <GroupName>TARKETT AB</GroupName>
            </HourMeter>
        </HourMeterList>
    </IndividualItem>
</IndividualItem_Report>

【问题讨论】:

    标签: sql xml sql-server-2008 tsql


    【解决方案1】:

    我假设 HourMeterList 是一个多值

    来自工作代码
    这只是选择列表的一部分

    ,(select top 1 'MV' 
      from docMVenum1 with (nolock) 
        where docMVenum1.sID = docSVsys.sID and docMVenum1.enumID = '179') 
      as 'RFPResponse/@SVMV'
    ,(select top 1 'RFP Response#' 
      from docMVenum1 with (nolock) 
        where docMVenum1.sID = docSVsys.sID and docMVenum1.enumID = '179') 
      as 'RFPResponse/@displayName'
     , (select docEnum1.value 
          from docMVenum1 with (nolock) 
          join docEnum1 with (nolock) 
          on docEnum1.enumID = docMVenum1.enumID and docEnum1.valueID = docMVenum1.valueID
          where docMVenum1.sID = docSVsys.sID and docMVenum1.enumID = '179' 
          order by docEnum1.value 
          FOR XML PATH (''), type 
       ) as [RFPResponse]
    

    样本输出

    <RFPResponse SVMV="MV" displayName="RFP Response#">
      <value>RFPa</value>
      <value>RFPb</value>
    </RFPResponse>
    

    【讨论】:

    • 嗨!是的,它可以是一个多值,但在这种情况下不是。在这种情况下,我只需要将它也添加到我的 xml 结果中。有办法做到这一点吗?
    • 我真的不明白,所以我唯一需要添加的是选择更多的列然后我们作为它之后?
    • 我真的不明白你的问题“我唯一需要添加的是选择更多的列然后我们作为它之后?”那来自工作代码。你试过什么?
    • 我试图在内部关节之后添加为“HourList”,但后来我得到了错误的元素,而不是我想要的顺序。是否可以包起来。 B353520130221TARKETT AB 成其他 2 个元素?
    • 在你的例子中我只有额外的属性。
    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多