Sometimes, you need to check which queries are running in your SQL Server. If you want to understand what’s happening inside your SQL Server—such as diagnosing errors or slow performance—xEvents can be very helpful.
🔍 What is Extended Events (xEvents)?
Extended Events is a lightweight performance monitoring system built into SQL Server.
It helps you:
✅ Capture detailed information about queries, errors, and performance.
✅ Diagnose issues like slow queries or unexpected errors.
✅ Monitor safely with minimal overhead, compared to older tools like Profiler.
Think of xEvents as a flight recorder for SQL Server: you start it, reproduce the issue, stop it, and then review what happened.
You can find a step-by-step guide in the reference below.
📖 Quickstart: Extended Events - SQL Server | Microsoft Learn
https://learn.microsoft.com/en-us/sql/relational-databases/extended-events/quick-start-extended-events-in-sql-server?view=sql-server-ver17
In this blog, I am sharing a T-SQL script that I usually provide to customers for troubleshooting support cases.
🛠 Step-by-Step Instructions
The captured data will be saved as .xel files in the default SQL Server log folder (you can change this path if needed).
Step 1: Create the xEvent Session
Run the T-SQL script below on the target instance using an account with sysadmin rights or sufficient privileges to create an xEvent session.
CREATE EVENT SESSION [XEventTmpl] ON SERVER
ADD EVENT sqlserver.attention (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.error_reported (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.rpc_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.rpc_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sp_statement_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sp_statement_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_batch_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_batch_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_statement_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_statement_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
)
ADD TARGET package0.event_file (
SET filename = N'xeventtmpl.xel'
)
WITH (STARTUP_STATE = OFF);
✅ Step 2: Start Collecting Events
Run this command to start the xEvent session so it begins capturing data:
ALTER EVENT SESSION [XEventTmpl] ON SERVER STATE = START
What this does: Turns on the session you created earlier.
💡Tip: To confirm it’s running status in SQL Server Management Studio (SSMS):
- Go to Management → Extended Events → Sessions
- Look for XEventTmpl in the list
- If it’s running, the icon will show a green arrow. If it’s stopped, it will show a red square.
🔍 View the Results
To check the data you have collected with Extended Events in SQL Server Management Studio (SSMS):
- Go to Management → Extended Events → Sessions.
- Find and right-click on XEventTmpl.
- You can choose Watch Live Data to See the events as they happen, while the session is running.
Alternatively, you can use the following query to read the .xel files directly:
SELECT * FROM sys.fn_xe_file_target_read_file('xeventtmpl*.xel', NULL, NULL, NULL)
👁️ What This Captures
The xEvents session will collect the following types of activity:
- sql_batch_starting / sql_batch_completed:
Records when an ad-hoc T-SQL batch starts and ends.- rpc_starting / rpc_completed:
Records when a remote procedure call (RPC), such as one from an application using sp_executesql, begins and finishes.- sp_statement_starting / sp_statement_completed:
Records when each statement inside a stored procedure starts and completes.- sql_statement_starting / sql_statement_completed:
Records when a standalone T-SQL statement starts and finishes.- error_reported:
Captures whenever SQL Server reports an error, including the severity, error number, and message.- attention:
Indicates when a query is canceled or times out (for example, if a user presses cancel or there is a client timeout).For each event, the session also collects helpful details, such as:
Action
Description
sql_text
The exact T-SQL command that was run.
client_app_name
The name of the application (like SSMS or a .NET app) that sent the request.
client_hostname
The computer name where the request came from.
client_pid
The process ID of the client application.
username
The SQL Server login or user who ran the query.
session_id
The session ID (SPID) on SQL Server.
✅ Step 3: Stop the Session
When you’re done collecting data, stop the session:
ALTER EVENT SESSION [XEventTmpl] ON SERVER STATE = STOP
If you no longer need the session, remove it completely:
DROP EVENT SESSION [XEventTmpl] ON SERVER
❓ FAQ
Q. Will this slow my server?
A. No, Extended Events is lightweight and safe for short captures.
https://learn.microsoft.com/en-us/sql/relational-databases/extended-events/extended-events
Q. What permission do i need to run this query?
A. You need either the ALTER ANY EVENT SESSION permission or, typically, sysadmin rights.
Q. How do I share with Support?
A. Please compress (zip) the .xel files from your target folder and attach them to your support case.
Also, include the time when you reproduced the issue.
Make sure you have reproduced the issue after starting the session in step 2, not just after creating the xEvent in step 1.
If you have not changed the default output location, you can use the "Basic Log" scenario with the SQL_LogScout tool. This tool will also collect other important logs that are helpful for troubleshooting.
For more details about SQL_LogScout, please visit:
https://github.com/microsoft/SQL_LogScout
Q. Can I use the same query to collect xEvents logs on Azure SQL Managed Instance (SQL MI)?
A. On Azure SQL Managed Instance, xEvents cannot save files to a local server folder. Instead, you need to save the event file to Azure Blob Storage. To do this, please create a credential that matches your storage container’s URL, as shown below:
CREATE CREDENTIAL [https://<storage-account>.blob.core.windows.net/<container-name>] -- change here
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<your-SAS-token>'; -- change here
Next, update the filename in your event session to use the blob storage path instead of a local file path. For example:
CREATE EVENT SESSION [XEventTmpl] ON SERVER
……..
ADD TARGET package0.event_file(
SET filename=N'https://<storage-account>.blob.core.windows.net/<container-name>/'xeventtmpl.xel' -- it should be blob url not local filepath
)
📘 SQL Server で実行中のクエリをキャプチャする方法
SQL Server の内部で「どんなクエリが流れているか」「どの操作でエラーが出ているか」を確認したいときは、拡張イベント(xEvents) が便利です。拡張イベントは SQL Server に標準搭載されている機能であり、パフォーマンスへの影響も軽微です。
拡張イベントの設定手順及び詳細につきましては、下記の公開情報に掲載されています。
📖 クイック スタートの拡張イベント - SQL Server | Microsoft Learn
https://learn.microsoft.com/ja-jp/sql/relational-databases/extended-events/quick-start-extended-events-in-sql-server?view=sql-server-ver17
本ブログでは、サポート対応時にお客様へご案内することが多い T-SQL スクリプトを使って、最小ステップでキャプチャを始める方法をご紹介します。
🛠 拡張イベント ログの収集方法
以下の手順では、SQL Server の既定ログ フォルダーにログを保存する設定となっておりますが、保存先は変更可能です。
✅ ステップ1:拡張イベント セッションを作成する
対象のインスタンス上で、下記クエリを sysadmin のような拡張イベントセッションの作成に必要な権限を有するアカウントにて実行します。
CREATE EVENT SESSION [XEventTmpl] ON SERVER
ADD EVENT sqlserver.attention (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.error_reported (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.rpc_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.rpc_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sp_statement_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sp_statement_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_batch_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_batch_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_statement_completed (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
),
ADD EVENT sqlserver.sql_statement_starting (
ACTION(package0.event_sequence,sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.database_id, sqlserver.database_name, sqlserver.query_hash, sqlserver.session_id, sqlserver.sql_text, sqlserver.transaction_id, sqlserver.transaction_sequence, sqlserver.username)
)
ADD TARGET package0.event_file (
SET filename = N'xeventtmpl.xel'
)
WITH (STARTUP_STATE = OFF);
✅ ステップ2:拡張イベントの開始
以下のクエリを実行することで、拡張イベントの収集を開始できます。
ALTER EVENT SESSION [XEventTmpl] ON SERVER STATE = START
💡Tip: SQL Server Management Studio(SSMS)上で拡張イベントが有効になっているかをご確認いただく方法:
➤ SQL Server Management Studio(SSMS)を開き、[管理] → [拡張イベント] → [セッション] の順に展開します。
➤ 一覧の中から 「XEventTmpl」 を見つけます。
➤ セッションが実行中の場合は、アイコンに 緑色の矢印 が表示されます。停止中の場合は、赤色の四角形 が表示されます。
🔍 結果(収集データ)の確認方法
SQL Server Management Studio(SSMS)で拡張イベントの収集データを確認するには、以下の手順を実施してください。
- SQL Server Management Studio(SSMS)を開き、[管理] → [拡張イベント] → [セッション] の順に展開します。
- 一覧の中から「XEventTmpl」を探して右クリックします。セッションが実行中の場合は「Watch Live Data」を選択し、リアルタイムでイベントを確認できます。
また、以下のクエリでも確認可能です。
SELECT * FROM sys.fn_xe_file_target_read_file('xeventtmpl*.xel', NULL, NULL, NULL)
👁️ 取得できる情報
このセッションでは、以下の種類のイベントを収集します。
- sql_batch_starting / sql_batch_completed:
アドホックな T-SQL バッチの開始と終了- rpc_starting / rpc_completed:
sp_executesql などの RPC の開始と終了- sp_statement_starting / sp_statement_completed:
ストアドプロシージャ内の各ステートメントの開始と完了- sql_statement_starting / sql_statement_completed:
単独の T-SQL ステートメントの開始と終了- error_reported:
SQL Server が報告したエラー情報(重大度、エラー番号、メッセージなど)- attention:
クエリのキャンセルやタイムアウト時の記録また、各イベントごとに以下のような詳細情報も収集されます。
アクション
説明
sql_text
実行された T-SQL コマンドの内容
client_app_name
リクエスト元のアプリケーション名
client_hostname
リクエスト元のコンピューター名
client_pid
クライアント アプリケーションのプロセス ID
username
実行ユーザーの SQL Server ログイン名
session_id
SQL Server 上のセッション ID(SPID)
✅ ステップ3:拡張イベントの停止
以下のクエリを実行することで、拡張イベントの収集を停止できます。
ALTER EVENT SESSION [XEventTmpl] ON SERVER STATE = STOP
拡張イベントが不要な場合は、下記クエリを実行して削除します。
DROP EVENT SESSION [XEventTmpl] ON SERVER
🗂 保存先について:
収集されたログは、xeventtmpl_*.xel という名前で、SQL Server の既定ログフォルダーに保存されます。お問い合わせの際には、該当フォルダー全体を ZIP ファイルにまとめてご提供いただけますと、よりスムーズに調査を進めることができます。