共用方式為


sys.fn_xe_file_target_read_file (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

讀取延伸事件目標所建立的 event_file 事件記錄檔 XEL 檔案。 結果集中的每一列都代表一個事件。 事件資料會以 XML 格式傳回。

XEL 檔案也可以由 SQL Server Management Studio 讀取。 如需逐步解說,請參閱 快速入門:擴充事件

Transact-SQL 語法慣例

語法

sys.fn_xe_file_target_read_file ( path , mdpath , initial_file_name , initial_offset )

引數

path

要讀取之檔案的路徑。 pathnvarchar(260), 沒有預設值。

  • 與本端檔案系統中的檔案搭配使用時, path 必須包含事件階段作業日誌檔的名稱。 檔案名稱可以包含 * 作為萬用字元,以從多個檔案讀取資料。

  • 搭配 Azure 儲存體容器中的 Blob 使用時, path 是由兩個部分串連所建構的 HTTP URL:

    1. Azure 儲存體儲存體容器的路徑,後面接著斜線 (/)。

    2. 容器中應讀取之 Blob 名稱的通用前置詞。 若要讀取單一 Blob,請使用 Blob 的完整名稱。

    例如,使用 https://<storage-account-name>.blob.core.windows.net/container-name>/xe_session as 路徑 會從名稱開頭 xe_session為 的所有 Blob 擷取資料,且不論 Blob 名稱的其餘部分 (包括副檔名) 為何。 無法指定萬用字元。

mdpath

對應至 path 自變數所指定檔案或檔案之元數據檔案的路徑。 mdpathnvarchar(260), 沒有預設值。

在 SQL Server 2012 (11.x) 和更新版本中,您不需要此參數。 它會保留以取得回溯相容性,適用於舊版 SQL Server 中產生的記錄檔。 在 SQL Server 2016 (13.x) 和更新版本中,此參數可以指定為 NULL,因為 .xem 不再使用檔案。

initial_file_name

要從 路徑讀取的第一個檔案。 initial_file_name為 nvarchar(260),沒有預設值。 如果 NULL 指定為 自變數,則會讀取路徑中找到的所有檔案。

檔名必須是具有相同sys.fn_xe_file_target_read_file函數呼叫結果集中傳回的值。

initial_offset

用來指定先前讀取的上次偏移。 略過所有事件,直到偏移量(含)。 事件列舉會在指定的位移之後開始。 initial_offset是 bigint。 如果 NULL 指定為 自變數,則會讀取整個檔案。

注意

initial_file_name和initial_offset都是配對的自變數。 如果您為任一自變數指定值,則必須為另一個自變數指定值。

傳回的資料表

資料行名稱 資料類型 描述
module_guid uniqueidentifier 事件模組 GUID。 不可為 Null。
package_guid uniqueidentifier 事件封裝 GUID。 不可為 Null。
object_name nvarchar(256) 事件的名稱。 不可為 Null。
event_data nvarchar(max) 事件內容,以 XML 格式表示。 不可為 Null。
file_name nvarchar(260) 包含事件的檔名。 不可為 Null。
file_offset bigint 包含事件的檔案中區塊的位移。 不可為 Null。
timestamp_utc datetime2(7) 事件的日期和時間(UTC 時區)。 不可為 Null。

適用於:SQL Server 2017 (14.x) 和更新版本、Azure SQL 資料庫和 Azure SQL 受控執行個體。

備註

在 Management Studio 中執行 sys.fn_xe_file_target_read_file 來讀取大型結果集可能會導致錯誤。 使用結果到檔案模式 (在 SQL Server Management Studio 中,Ctrl+Shift+F) 將大型結果集匯出至人類可讀取的檔案,改為使用另一個工具讀取檔案。

SQL Server 2008 (10.0.x) 和 SQL Server 2008 R2 (10.50.x) 接受以 XEL 和 XEM 格式產生的追蹤結果。 SQL Server 2012 (11.x) 擴充事件僅支援 XEL 格式的追蹤結果。 建議您使用Management Studio以 XEL 格式讀取追蹤結果。

Azure SQL

在 Azure SQL 受控執行個體或 Azure SQL 資料庫中,目標所 event_file 建立的檔案一律會儲存為 Azure 儲存體容器中的 Blob。

如果存在允許存取 Azure 儲存體容器的認證,您可以使用來 sys.fn_xe_file_target_read_file 從這些 Blob 讀取資料。 如需逐步解說,請檢閱在 Azure 儲存體中建立具有event_file目標的事件工作階段。

如果您指定本端檔案系統路徑,您會收到類似下列的錯誤訊息:

Msg 40538, Level 16, State 3, Line 15
A valid URL beginning with 'https://' is required as value for any filepath specified.

權限

在 SQL Server 2019 (15.x) 和舊版中,需要 VIEW SERVER STATE 伺服器的許可權。

在 SQL Server 2022 (16.x) 和更新版本中,需要 VIEW SERVER PERFORMANCE STATE 伺服器上的許可權。

範例

A. 從本機檔案系統中的檔案擷取資料

針對 SQL Server 2014 (12.x) 和舊版,下列範例會從所有檔案取得所有數據列,包括 .xel.xem 檔案。 在此範例中,檔案目標和元檔位於 資料夾中的 C:\traces\ 追蹤資料夾中。

SELECT *
FROM sys.fn_xe_file_target_read_file('C:\traces\*.xel', 'C:\traces\metafile.xem', NULL, NULL);

在 SQL Server 2016 (13.x) 和更新版本中,下列範例會擷取預設資料夾中所有 .xel 檔案內的事件。 預設位置位於 \MSSQL\Log 實例的安裝資料夾中。

SELECT *
FROM sys.fn_xe_file_target_read_file('*.xel', NULL, NULL, NULL);

在 SQL Server 2017 (14.x) 和更新版本中,下列範例只會從內建system_health會話擷取過去一天的數據。 system_health 工作階段是預設包含於 SQL Server 的擴充事件工作階段。 如需詳細資訊,請參閱使用 system_health 工作階段

SELECT *
FROM sys.fn_xe_file_target_read_file('system_health*.xel', NULL, NULL, NULL)
WHERE CAST (timestamp_utc AS DATETIME2 (7)) > DATEADD(DAY, -1, GETUTCDATE());

B. 從 Azure 儲存體容器中的 Blob 擷取資料

從容器中名稱開頭 xe_session_的所有 Blob 讀取資料。

SELECT *
FROM sys.fn_xe_file_target_read_file(
    'https://<storage-account-name>.blob.core.windows.net/<container-name>/xe_session_',
    NULL,
    NULL,
    NULL
);

從 Blob 讀取 xe_session_0_133614763336380000.xel 資料。

SELECT *
FROM sys.fn_xe_file_target_read_file(
    'https://<storage-account-name>.blob.core.windows.net/<container-name>/xe_session_0_133614763336380000.xel',
    NULL,
    NULL,
    NULL
);

從位移 33280 開始的 xe_session_0_133614763336380000.xel Blob 讀取資料。

SELECT *
FROM sys.fn_xe_file_target_read_file(
    'https://<storage-account-name>.blob.core.windows.net/<container-name>/xe_session_',
    NULL,
    'https://<storage-account-name>.blob.core.windows.net/<container-name>/xe_session_0_133614763336380000.xel',
    33280
);