2017-06-21 5 views
0

私は、SQL2008r2で書いた拡張イベントから情報を削り取り、SQL上でエラートラッキングのより良いフォームを作成しようとしました。1つのレコードのみを返すXquery

多くの試行錯誤の後に私はついにが働いてになりましたが、最初の行だけを返すようです。私はので、私はそのデータに追加処理を行うと、私が書いた何を別のフォーマット

でそれを返すことができ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> 

私が得たもの:1つの行を返すように見えますが、それはCTEでもかまいませんか?

だから私の質問は次のとおりです。

私はXML内のレコードの残りが通って引っ張らなければ取得できますか?

何か助力や提案をいただければ幸いです。

答えて

0

あなたは次のような変更を行う必要があります:

[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... 
関連する問題