2

私はこれを解析しようとしています。イベントごとに1つのレコードが必要なので、各イベントを個別にクエリする方法が必要です。

しかし、私はそれを次のように見せたいと思います:

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

編集:(ありがとう、マーク)マークのコードを使用して、私が欲しいものの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

(ただし、明らかに、イベント名が必要です)

4

2 に答える 2

2

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
于 2012-09-19T23:49:15.767 に答える
2

私を正しい方向に向けてくれた@Marc_Sに感謝します!マーク、あなたがクレジットを取得する方法がある場合は、ここに答えを追加するか、何でもしてください。クレジットします。

SELECT
    DataName = Evt.value('../@name[1]', 'varchar(50)'),
    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)
于 2012-09-20T18:35:53.093 に答える