【问题标题】:Xquery only returning a single recordXquery 只返回一条记录
【发布时间】:2017-06-21 11:59:23
【问题描述】:

我一直在尝试从我在 SQL2008r2 中编写的扩展事件中提取信息,以尝试在 SQL 上创建一些更好的错误跟踪形式。

经过大量试验和错误,我最终得到了一个工作,但它似乎只返回第一行。我正在尝试将信息读入 CTE,以便对数据进行额外处理并以不同格式返回

我写的

;with events_cte as(
select
DATEADD(mi,
DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP),
xevents.event_data.value('(RingBufferTarget/event/@timestamp)[1]', 'datetime2')) AS [Timestamp],
xevents.event_data.value('(RingBufferTarget/event/data[@name="severity"]/value)[1]', 'bigint') AS [Error Severity],
xevents.event_data.value('(RingBufferTarget/event/data[@name="message"]/value)[1]', 'nvarchar(512)') AS [Error Message],
xevents.event_data.value('(RingBufferTarget/event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS [SQL Text],
xevents.event_data.value('(RingBufferTarget/event/action[@name="username"]/value)[1]', 'nvarchar(max)') AS [Username],
xevents.event_data.value('(RingBufferTarget/event/action[@name="database_id"]/value)[1]', 'nvarchar(max)') AS [DatabaseID]
From(Select CAST(xet.target_data AS xml) as event_data
FROM sys.dm_xe_session_targets xet
       INNER JOIN sys.dm_xe_sessions xe
              ON (xe.address = xet.event_session_address) 
WHERE xe.name = 'what_queries_are_failing') as xevents)

我在做什么(一个例子)

    <RingBufferTarget eventsPerSec="0" processingTime="0" totalEventsProcessed="55" eventCount="55" droppedCount="0" memoryUsed="161803">
      <event name="error_reported" package="sqlserver" id="100" version="1" timestamp="2016-12-15T01:42:59.361Z">
        <data name="error">
          <type name="int32" package="package0" />
          <value>50000</value>
          <text />
        </data>
        <data name="severity">
          <type name="int32" package="package0" />
          <value>16</value>
          <text />
        </data>
        <data name="state">
          <type name="int32" package="package0" />
          <value>1</value>
          <text />
        </data>
        <data name="user_defined">
          <type name="boolean" package="package0" />
          <value>true</value>
          <text />
        </data>
        <data name="message">
          <type name="unicode_string" package="package0" />
          <value>User Defined Exception!!!</value>
          <text />
        </data>
        <action name="client_hostname" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>hostname</value>
          <text />
        </action>
        <action name="database_id" package="sqlserver">
          <type name="uint16" package="package0" />
          <value>1</value>
          <text />
        </action>
        <action name="sql_text" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>RAISERROR('User Defined Exception!!!', 16, 1) 
    </value>
          <text />
        </action>
        <action name="tsql_stack" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>&lt;frame level='1' handle='0x010001001561AB09005F28B1000000000000000000000000' line='1' offsetStart='0' offsetEnd='-1'/&gt;</value>
          <text />
        </action>
        <action name="username" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>user</value>
          <text />
        </action>
      </event>
      <event name="error_reported" package="sqlserver" id="100" version="1" timestamp="2016-12-15T01:42:59.361Z">
        <data name="error">
          <type name="int32" package="package0" />
          <value>50000</value>
          <text />
        </data>
        <data name="severity">
          <type name="int32" package="package0" />
          <value>16</value>
          <text />
        </data>
        <data name="state">
          <type name="int32" package="package0" />
          <value>1</value>
          <text />
        </data>
        <data name="user_defined">
          <type name="boolean" package="package0" />
          <value>true</value>
          <text />
        </data>
        <data name="message">
          <type name="unicode_string" package="package0" />
          <value>User Defined Exception!!!</value>
          <text />
        </data>
        <action name="client_hostname" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>hostname</value>
          <text />
        </action>
        <action name="database_id" package="sqlserver">
          <type name="uint16" package="package0" />
          <value>1</value>
          <text />
        </action>
        <action name="sql_text" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>RAISERROR('User Defined Exception!!!', 16, 1) 
    </value>
          <text />
        </action>
        <action name="tsql_stack" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>&lt;frame level='1' handle='0x010001001561AB09005F28B1000000000000000000000000' line='1' offsetStart='0' offsetEnd='-1'/&gt;</value>
          <text />
        </action>
        <action name="username" package="sqlserver">
          <type name="unicode_string" package="package0" />
          <value>user</value>
          <text />
        </action>
      </event>
</RingBufferTarget>

我得到了什么:似乎只返回一行,可能是 CTE 吗?

所以我的问题是:

如何让 XML 中的其余记录被拉出?

任何帮助或建议将不胜感激。

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2 xquery xquery-sql


    【解决方案1】:

    您必须进行以下更改:

    [1]

    FROM sys.dm_xe_session_targets xet
           INNER JOIN sys.dm_xe_sessions xe ON (xe.address = xet.event_session_address) 
           OUTER APPLY xevents.event_data.nodes('RingBufferTarget/event') AS x(XmlCol)
    

    [2] 来自

    xevents.event_data.value('(RingBufferTarget/event/@timestamp)[1]', 'datetime2')) AS [Timestamp],
    xevents.event_data.value('(RingBufferTarget/event/data[@name="severity"]/value...
    

    x.XmlCol.value('(@timestamp)[1]', 'datetime2')) AS [Timestamp],
    x.XmlCol.value('(data[@name="severity"]/value...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2016-05-22
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多