【问题标题】:Outputting multi level XML from SQL query result从 SQL 查询结果输出多级 XML
【发布时间】:2015-11-10 22:14:00
【问题描述】:

我正在尝试将 SQL Server 2012 查询结果转换为格式化的 XML 结果。 我通常使用 Visual Basic 循环遍历记录集并形成它。

查询是:

SELECT top 3
    Plant_Devices.DeviceNumber, Plant_Devices.DeviceName, 
    SYS_Templates.TemplateTag, Plant_Alarms_Groups.GroupTag
FROM
    Plant_Devices 
INNER JOIN 
    SYS_Templates ON Plant_Devices.SYS_Templates_CID = SYS_Templates.CID 
INNER JOIN 
    Plant_Alarms_Groups ON Plant_Devices.Plant_Alarms_Groups_CID = Plant_Alarms_Groups.CID 
                        AND Plant_Devices.Plant_Alarms_Groups_CID = Plant_Alarms_Groups.CID

结果是:

DeviceNumber    DeviceName  TemplateTag GroupTag
1   Stucco & Dry Add. D/C Fan   D_Motor_Standard    WM1_StuccoSys
10  Kiln Drive  D_Drive_Standard    WM1_KilnSys
118 HRA Feeder Agitator #1  D_Motor_Standard    WM1_DryAdditives

所需的 XML 输出是:

<Tags>
   <Tag name="1" path="" type="UDT_INST">
      <Property name="Documentation" type="String">Stucco &amp; Dry Add. D/C Fan</Property>
      <Property name="DataType">2</Property>
      <Property name="UDTParentType">D_Motor_Standard</Property>
      <Parameters>
         <Property name="AlarmGroup" type="String">WM1_StuccoSys</Property>
         <Property name="DisplayName" type="String">1</Property>
         <Property name="ID" type="String">1</Property>
          </Parameters>
       </Tag>
       <Tag name="10" path="" type="UDT_INST">
          <Property name="Documentation" type="String">Kiln Drive</Property>
          <Property name="DataType">2</Property>
          <Property name="UDTParentType">D_Drive_Standard</Property>
          <Parameters>
             <Property name="AlarmGroup" type="String">WM1_KilnSys</Property>
             <Property name="DisplayName" type="String">10</Property>
             <Property name="ID" type="String">10</Property>
          </Parameters>
       <Tag name="118" path="" type="UDT_INST">
          <Property name="Documentation" type="String">HRA Feeder Agitator     #1</Property>
          <Property name="DataType">2</Property>
          <Property name="UDTParentType">D_Motor_Standard</Property>
          <Parameters>
             <Property name="AlarmGroup" type="String">WM1_DryAdditives</Property>
             <Property name="DisplayName" type="String">118</Property>
             <Property name="ID" type="String">118</Property>
          </Parameters>
       </Tag>
    </Tag>
</Tags>

谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow。您可能会发现您需要更具体地了解您希望如何实现最终结果。您想再次使用 VB 脚本吗?或者您是否正在寻找另一种解决方案?我真的看不到这里的问题,它看起来更像是为我做这个。
  • 我一直在尝试使用 SQL 服务器中的 xml 生成器来输出所需的 XML。但我似乎无法输出二级和三级分支。

标签: xml sql-server-2012


【解决方案1】:

不确定您在寻找什么,但我会像这样使用 XML Linq

Imports System.Data
Imports System.Xml
Imports System.Xml.Linq
Module Module1

    Sub Main()
        Dim dt As New DataTable
        dt.Columns.Add("DeviceNumber", GetType(Integer))
        dt.Columns.Add("DeviceName", GetType(String))
        dt.Columns.Add("TemplateTag", GetType(String))
        dt.Columns.Add("GroupTag", GetType(String))

        dt.Rows.Add(New Object() {1, "Stucco & Dry Add. D/C Fan", "D_Motor_Standard", "WM1_StuccoSys"})
        dt.Rows.Add(New Object() {10, "Kiln Drive", "D_Drive_Standard", "WM1_KilnSys"})
        dt.Rows.Add(New Object() {118, "HRA Feeder Agitator #1", "D_Motor_Standard", "WM1_DryAdditives"})

        Dim tags As New XElement("Tags")

        For Each row As DataRow In dt.AsEnumerable
            Dim deviceNumber As Integer = row("DeviceNumber")
            Dim deviceName As String = row("DeviceName")
            Dim templateTag As String = row("TemplateTag")
            Dim groupTag As String = row("GroupTag")

            Dim tag As XElement = New XElement("Tag", New Object() {New XAttribute("name", deviceNumber), New XAttribute("path", ""), New XAttribute("type", "UDT_INST")})
            tags.Add(tag)


            Dim properties As List(Of XElement) = New List(Of XElement)({ _
                New XElement("Property", New Object() {New XAttribute("name", "Documentation"), New XAttribute("type", "String"), deviceName}), _
                New XElement("Property", New Object() {New XAttribute("name", "DataType"), 2}), _
                New XElement("Property", New Object() {New XAttribute("name", "UDTParentType"), templateTag}) _
            })
            tag.Add(properties)

            properties = New List(Of XElement)({ _
                New XElement("Property", New Object() {New XAttribute("name", "AlarmGroup"), New XAttribute("type", "String"), groupTag}), _
                New XElement("Property", New Object() {New XAttribute("name", "DisplayName"), New XAttribute("type", "String"), deviceNumber}), _
                New XElement("Property", New Object() {New XAttribute("name", "ID"), New XAttribute("type", "String"), deviceNumber}) _
            })

            Dim parameters As XElement = New XElement("Parameters", properties)
            tag.Add(parameters)
        Next
    End Sub

End Module
​

【讨论】:

  • 谢谢,我对在 Visual Basic 中执行此操作很熟悉,我正在尝试使用查询和 FOR XML 选项在 SQL Server 中生成此操作。
  • 您可以从 Visual Basic 中查询 SQL server 并获取数据表。不确定是否可以在 SQL Server 中实现自定义 xml。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多