2017-05-08 6 views
0

this answerに基づいており、拡張イベントトレースファイルのイベントから「コールスタック形式」の結果セットを返すクエリを持っています。XMLクエリCTEの問題点を教えてください。

迅速なクエリ

SELECT CONVERT (XML, event_data) AS data 
     FROM sys.fn_xe_file_target_read_file ('C:\Temp\test_trace*.xel', 'C:\Temp\test_trace*.xem', NULL, NULL) 

返す結果の多くは、イベントがログに記録されていることを示すには、最終的にコールスタックのクエリは結果を返しません。このクエリは、次の2つのCTEに基づいています。CapturedResultsから選択すると、予想される結果が得られません。私がStackDataを照会すると、ゼロの結果が得られます。私は結果を生成しない第二CTEを考えて

<event name="sp_statement_completed" package="sqlserver" timestamp="2017-05-08T12:37:15.132Z"> 
    .... 
    <action name="tsql_stack" package="sqlserver"> 
    <value> 
     <frames> 
     <frame level="1" handle="0x03003D0084CC28352EF7C1006DA7000000000000000000000000000000000000000000000000000000000000" line="10" offsetStart="384" offsetEnd="466" /> 
     <frame level="2" handle="0x03003D00DAA5E13A62E99F006DA7000001000000000000000000000000000000000000000000000000000000" line="3" offsetStart="114" offsetEnd="-1" /> 
     <frame level="3" handle="0x01003D005CB2C92D10024E8F0000000000000000000000000000000000000000000000000000000000000000" line="2" offsetStart="4" offsetEnd="-1" /> 
     </frames> 
    </value> 
    </action> 
</event> 

私が開始した、全体のクエリを投稿していない次のように

stack_xml列を生成しなければならない問題となっているXMLノードは、見えます問題と私はまずそれに対処する必要があります。クエリ全体がゼロの結果も返します。

答えて

1

xml-> xml変換では.query()ではなく.value()を使用します。 .VALUE()XMLベースのためである>スカラー

WITH Events as 
    (
     SELECT CONVERT (XML, event_data) AS data 
     FROM sys.fn_xe_file_target_read_file ('C:\temp\test*.xel', 'C:\temp\test*.xem', NULL, NULL) 
    ), 
    CapturedResults AS 
    (SELECT data.value ('(/event/@timestamp)[1]', 'DATETIME')          AS [TIME], 
     data.value ('(/event/data[@name=''cpu'']/value)[1]', 'INT')         AS [CPU (ms)], 
     CONVERT (FLOAT, data.value ('(/event/data[@name=''duration'']/value)[1]', 'BIGINT'))/1000000 AS [Duration (s)], 
     data.value ('(/event/action[@name=''sql_text'']/value)[1]', 'VARCHAR(MAX)')     AS [SQL STATEMENT],  
     data.query('/event/action[@name=''tsql_stack'']/value')          AS [stack_xml]  
    FROM Events 
    ), 
    StackData AS 
    (SELECT frame_xml.value('(./@level)', 'int')  AS [frame_level], 
     frame_xml.value('(./@handle)', 'varchar(MAX)') AS [sql_handle], 
     frame_xml.value('(./@offsetStart)', 'int')  AS [offset_start], 
     frame_xml.value('(./@offsetEnd)', 'int')  AS [offset_end] 
    FROM CapturedResults CROSS APPLY stack_xml.nodes('//frame') N (frame_xml) 
    ) 
SELECT * 
FROM StackData 

デビッド

+0

ありがとうございました。今私はXMLクエリに関する少なくとも1つのことを知っています。 – ProfK

関連する問題