sql-server - t-sql XML 解析为包含事件、数据和值的多个记录

标签 sql-server xml t-sql xquery

我正在尝试解析这个问题。我想要每个事件都有一条记录,因此我需要一种方法来单独查询每个事件。

但我希望它看起来像这样:

Event Name                                         || ID  || Timestamp || process_utilization
---------------------------------------------------------------------------------------------
scheduler_monitor_system_heal_ring_buffer_recorded ||  0  || 0         || 33

这是 XML:

<events>
  <session startTime="2012-09-06T10:48:15.373" droppedEvents="0" largestDroppedEvent="0">
    <RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="14" eventCount="14" droppedCount="0" memoryUsed="3994">
      <event name="scheduler_monitor_system_health_ring_buffer_recorded" package="sqlos" timestamp="2012-09-19T16:46:33.091Z">
        <data name="id">
          <type name="uint32" package="package0" />
          <value>0</value>
        </data>
        <data name="timestamp">
          <type name="uint64" package="package0" />
          <value>0</value>
        </data>
        <data name="process_utilization">
          <type name="uint32" package="package0" />
          <value>33</value>
        </data>
      </event>
      <event name="resource_monitor_ring_buffer_recorded" package="sqlos" timestamp="2012-09-19T16:46:38.386Z">
        <data name="id">
          <type name="uint32" package="package0" />
          <value>0</value>
        </data>
      </event>
    </RingBufferTarget>
  </session>
</events>

编辑: 或者,如果我们可以返回如下所示的行,那就太好了:

scheduler_monitor_system_heal_ring_buffer_recorded || id || 0
scheduler_monitor_system_heal_ring_buffer_recorded || timestamp || 0
scheduler_monitor_system_heal_ring_buffer_recorded || process_utilization|| 33

编辑:(谢谢,马克) 使用 Mark 的代码,我得到了 98% 的我想要的 - 只需要事件名称。

SELECT
    DataName = Evt.value('@name[1]', 'varchar(50)'),
    TypeName= Evt.value('type[1]/@name[1]', 'varchar(50)'),
    DataValue = Evt.value('value[1]', 'varchar(50)'),
    DataText = Evt.value('text[1]', 'varchar(50)')
FROM 
    @input.nodes('/events/session/RingBufferTarget/event/data') as Tbl(Evt)

返回:

id                  uint32  0   NULL
timestamp           uint64  0   NULL
process_utilization uint32  33  NULL
id                  uint32  0   NULL

(但是,显然,需要事件名称)

最佳答案

假设您的 XML 位于名为 @input 的变量中,请尝试以下操作:

declare @input XML = '....(your XML here).....';

SELECT
    EventName = Evt.value('(@name)[1]', 'varchar(50)'),
    EventID = Evt.value('(data[@name="id"]/value)[1]', 'int'),
    EventTimeStamp = Evt.value('(data[@name="timestamp"]/value)[1]', 'bigint'),
    ProcessUtilization = Evt.value('(data[@name="process_utilization"]/value)[1]', 'int')
FROM 
    @input.nodes('/events/session/RingBufferTarget/event') as Tbl(Evt)

通过您的示例 XML,我得到的输出为:

EventName                                           EventID   EventTimeStamp ProcessUtilization
scheduler_monitor_system_health_ring_buffer_record     0          0              33
resource_monitor_ring_buffer_recorded                  0         NULL            NULL

关于sql-server - t-sql XML 解析为包含事件、数据和值的多个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12503313/

相关文章:

sql - 如何在 SQL Server 中使用 OPENQUERY 设置变量

xml - LINQ to XML 在标记之间生成\r\n?

sql-server - 窗口函数在子查询/CTE 中的行为不同?

sql-server - 提取 SQL Server 中位置或索引值之后的所有字符

sql-server - SQL Server 2005 中的 Case 语句

sql-server - 在SQL Server中获取特定时区的本地日期/时间

Java向xml文件添加具有属性的元素

java - 解析 xml 时检查属性是否存在

sql - 这是对 temptables 的适当使用吗?

c# - T-SQL:ASP.NET GridView 中选定列的动态查询