SQL Database の拡張イベントを永続化する場合、Azure ストレージに保存することになりますが、Azure ストレージの保存したログに関しては直接クエリで確認することができます。
クエリの実行に、CPU を結構喰うので、ローカルにダウンロードしてからの方がよいかと思いますが。
詳細については SQL Database の拡張イベントのためのイベント ファイル ターゲット コード を読むとよいかと
拡張イベントの保存先として使用しているストレージの情報については、以下のクエリで確認ができます。
-- 拡張イベントの情報の取得 SELECT name, target_name, target.value('(/EventFileTarget/File/@name)[1]', 'varchar(500)') AS xEventFile FROM ( SELECT name, target_name, CAST(target_data AS XML) AS target FROM sys.dm_xe_database_session_targets st LEFT JOIN sys.dm_xe_database_sessions s ON s.address = st.event_session_address WHERE target_name = 'event_file' ) AS T
ストレージの場所が特定できたら以下のクエリで拡張イベントの内容を確認することができます。
-- 直接クエリ版 DECLARE @xEventFile varchar(500) = 'https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>/<トレースファイル>' SELECT object_name, target.value('(/event/@timestamp)[1]', 'datetime2') AS timestamp, target.query('/event/data[@name="error_number"]').value('.', 'int') AS error_number, target.query('/event/data[@name="message"]').value('.', 'nvarchar(max)') AS error_number, target.query('/event/action[@name="sql_text"]').value('.', 'nvarchar(max)') AS error_number FROM( SELECT *, CAST(event_data AS XML) AS target FROM sys.fn_xe_file_target_read_file (@xEventFile, null, null, null) WHERE object_name = 'error_reported' AND CAST(event_data AS XML).query('/event/data[@name="error_number"]').value('.', 'int') NOT IN(102, 156, 207, 2528, 7955) ) AS T -- 一時テーブル版 DECLARE @xEventFile varchar(500) = 'https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>/<トレースファイル>' DROP TABLE IF EXISTS #xmldata CREATE TABLE #xmldata (C1 int IDENTITY PRIMARY KEY,object_name varchar(255), xml_data XML) INSERT INTO #xmldata (object_name, xml_data) SELECT object_name, CAST(event_data AS XML) AS target FROM sys.fn_xe_file_target_read_file (@xEventFile, null, null, null) CREATE PRIMARY XML INDEX idx_xml on #xmldata (xml_data) SELECT object_name, xml_data.value('(/event/@timestamp)[1]', 'datetime2') AS timestamp, xml_data.query('/event/data[@name="error_number"]').value('.', 'int') AS error_number, xml_data.query('/event/data[@name="message"]').value('.', 'nvarchar(max)') AS error_number, xml_data.query('/event/action[@name="sql_text"]').value('.', 'nvarchar(max)') AS error_number FROM #xmldata WHERE object_name = 'error_reported' AND xml_data.query('/event/data[@name="error_number"]').value('.', 'int') NOT IN(102, 156, 207, 2528, 7955)
トレースファイルを指定する際に「.xel」まで指定すると該当のファイルのみ、トレースファイルの先頭のみを指定した場合 (上記の画像の例だと「Basic_Trace」) はストレージアカウント内の該当のファイルをまとめて検索することができます。