どうも、あおです。
SQLServerのトレースファイルをいちいちプロファイラで開かずに、
クエリエディタで見る場合の方法。(複数ファイルを見たい場合に便利。)
先に結果がこちら。見やすくする為など、色々編集してます。
コード
WITH w1 AS( SELECT EventClass,CAST(TextData AS VARCHAR(MAX)) AS TextData,ApplicationName,LoginName,SPID,StartTime,ServerName FROM sys.fn_trace_gettable(N'C:\Work\trc\20231010.trc',1) WHERE EventClass IN ('65533','65534') UNION SELECT EventClass,CAST(TextData AS VARCHAR(MAX)) AS TextData,ApplicationName,LoginName,SPID,StartTime,ServerName FROM sys.fn_trace_gettable(N'C:\Work\trc\20231014.trc',1) WHERE EventClass IN ('65533','65534') UNION SELECT EventClass,CAST(TextData AS VARCHAR(MAX)) AS TextData,ApplicationName,LoginName,SPID,StartTime,ServerName FROM sys.fn_trace_gettable(N'C:\Work\trc\20231015.trc',1) WHERE EventClass IN ('65533','65534') ) SELECT w1.EventClass ,CASE w1.EventClass WHEN '65534' THEN '処理開始' WHEN '65533' THEN '処理終了' END AS EventClassName ,w1.TextData ,w1.ApplicationName ,w1.LoginName ,w1.SPID ,w1.StartTime ,w1.ServerName FROM w1 ORDER BY w1.StartTime
解説
1.「TextData」はCASTで型変換しないと、UNIONの際にエラーになる為、
変換しています。
2.「fn_trace_gettable」でトレースファイルの場所を指定する際、
デスクトップをかいするとエラーになったので、Cドライブ下に専用の
フォルダを作成して、そこに保管するようにしました。
3.WHERE EventClass IN (‘65533′,’65534’)
で指定しているのは、今回、処理開始と処理終了のレコードを
取得したい為。取得したいEventClassが異なる場合は変更してください。
4.WITHで一旦すべてのトレースファイルの指定した内容を
UNIONで全て取得して、さらに並べ替えする為、再度取得しています。
5.EventClassのIDだけではわかりにくい為、
一応日本語名も「EventClassName」として追加しています。
補足:2~4行目のSELECT、UNIONの文は、EXCEL関数で取得するように
しておけば、ファイル数が多い場合に楽です。
例として、以下では、B列にファイル名を貼付け、D列のExcel関数で
SQLを組み立てています。
Excel関数(セル:D2)
="SELECT EventClass,CAST(TextData AS VARCHAR(MAX)) AS TextData,ApplicationName,LoginName,SPID,StartTime,ServerName FROM sys.fn_trace_gettable(N'C:\Work\trc\" & B2 &"',1) WHERE EventClass IN ('65533','65534')"
Excel関数(セル:D3以降。一旦D3セルに貼付けて、ドラッグで必要分追加。)
="UNION SELECT EventClass,CAST(TextData AS VARCHAR(MAX)) AS TextData,ApplicationName,LoginName,SPID,StartTime,ServerName FROM sys.fn_trace_gettable(N'C:\Work\trc\" & B3 &"',1) WHERE EventClass IN ('65533','65534')"
これで必要な項目をファイル数ぶん一度に見れるので、
プロファイラとはおさらば。