Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Om du har ett befintligt SQL Trace-skript som du vill konvertera till en extended events-session kan du använda procedurerna i det här avsnittet för att skapa en motsvarande extended events-session. Genom att använda informationen i trace_xe_action_map- och trace_xe_event_map-systemtabellerna kan du samla in den information som du måste ha för konverteringen.
Stegen omfattar följande:
Kör det befintliga skriptet för att skapa en SQL Trace-session och hämta sedan ID:t för spårningen.
Kör en fråga som använder funktionen fn_trace_geteventinfo för att hitta motsvarande händelser och åtgärder för extended events för varje SQL Trace-händelseklass och dess associerade kolumner.
Använd funktionen fn_trace_getfilterinfo för att lista filtren och motsvarande åtgärder för utökade händelser som ska användas.
Skapa en Extended Events-session manuellt med hjälp av motsvarande Extended Events-händelser, åtgärder och predikat (filter).
Hämta spårnings-ID:t
Öppna SQL Trace-skriptet i Frågeredigeraren och kör sedan skriptet för att skapa spårningssessionen. Observera att spårningssessionen inte behöver köras för att slutföra den här proceduren.
Hämta ID:t för spårningen. Använd följande fråga för att göra detta:
SELECT * FROM sys.traces; GOAnmärkning
Spårnings-ID 1 anger vanligtvis standardspårningen.
För att fastställa motsvarigheterna till Extended Events
För att fastställa motsvarande händelser och åtgärder för utökade händelser kör du följande fråga, där trace_id anges till värdet för det spårnings-ID som du fick i föregående procedur.
Anmärkning
I det här exemplet används spårnings-ID:t för standardspårningen (1).
USE MASTER; GO DECLARE @trace_id int; SET @trace_id = 1; SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event' , el.columnid, ec.xe_action_name AS 'action' FROM (sys.fn_trace_geteventinfo(@trace_id) AS el LEFT OUTER JOIN sys.trace_xe_event_map AS em ON el.eventid = em.trace_event_id) LEFT OUTER JOIN sys.trace_xe_action_map AS ec ON el.columnid = ec.trace_column_id WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;Motsvarande händelse-ID för Extended Events, paketnamn, händelsenamn, kolumn-ID och åtgärdsnamn returneras. Du kommer att använda dessa utdata i proceduren "För att skapa sessionen Utökade händelser" senare i det här avsnittet.
I vissa fall mappas den filtrerade kolumnen till ett händelsedatafält som ingår som standard i händelsen Extended Events. Därför är kolumnen "Extended_Events_action_name" NULL. Om detta inträffar måste du göra följande för att avgöra vilket datafält som motsvarar den filtrerade kolumnen:
För de åtgärder som returnerar NULL identifierar du vilka SQL Trace-händelseklasser i skriptet som innehåller kolumnen som filtreras.
Du kan till exempel ha använt händelseklassen SP:StmtCompleted och angett ett filter för kolumnnamnet Varaktighetsspårning (SQL Trace-händelseklass-ID 45 och SQL Trace-kolumn-ID 13). I det här fallet visas åtgärdsnamnet som NULL i frågeresultatet.
För varje SQL Trace-händelseklass som du identifierade i föregående steg letar du reda på motsvarande händelsenamn för Extended Events. (Om du inte är säker på motsvarande händelsenamn använder du frågan i ämnet Visa motsvarigheter för Extended Events till SQL Trace Event Classes.)
Använd följande fråga för att identifiera rätt datafält som ska användas för de händelser som du identifierade i föregående steg. Frågan visar datafälten Extended Events i kolumnen "event_field". I frågan ersätter <du event_name> med namnet på en händelse som du angav i föregående steg.
SELECT xp.name package_name, xe.name event_name ,xc.name event_field, xc.description FROM sys.trace_xe_event_map AS em INNER JOIN sys.dm_xe_objects AS xe ON em.xe_event_name = xe.name INNER JOIN sys.dm_xe_packages AS xp ON xe.package_guid = xp.guid AND em.package_name = xp.name INNER JOIN sys.dm_xe_object_columns AS xc ON xe.name = xc.object_name WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly' AND em.xe_event_name = '<event_name>';Till exempel mappar händelseklassen SP:StmtCompleted till händelsen sp_statement_completed Extended Events. Om du anger sp_statement_completed som händelsenamn i frågan visar kolumnen "event_field" de fält som ingår som standard med händelsen. När du tittar på fälten kan du se att det finns ett "varaktighetsfält". Om du vill skapa filtret i motsvarande extended events-session lägger du till ett predikat som "WHERE duration > 0". Ett exempel finns i proceduren "För att skapa sessionen Utökade händelser" i det här avsnittet.
Så här skapar du sessionen Extended Events
Använd Frågeredigeraren för att skapa sessionen Utökade händelser och för att skriva utdata till ett filmål. Följande steg beskriver en enskild fråga med förklaringar som visar hur du skapar frågan. Det fullständiga frågeexemplet finns i avsnittet "Exempel" i det här avsnittet.
Lägg till instruktioner för att skapa händelsesessionen och ersätt session_name med det namn som du vill använda för sessionen Extended Events.
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [Session_Name] ON SERVER; CREATE EVENT SESSION [Session_Name] ON SERVER;Lägg till händelser och åtgärder för utökade händelser som returnerades som utdata i proceduren "Fastställa motsvarande utökade händelser" och lägg till de predikat (filter) som du identifierade i proceduren "För att fastställa de filter som användes i skriptet".
I följande exempel används ett SQL Trace-skript som innehåller händelseklasserna SQL:StmtStarting och SP:StmtCompleted, med filter för sessions-ID och varaktighet. Exempelutdata för frågan i proceduren "Determine the Extended Events equivalents" returnerade följande resultatuppsättning:
Eventid package_name event columnid action 44 sqlserver sp_statement_starting 6 nt_username 44 sqlserver sp_statement_starting 9 client_pid 44 sqlserver sp_statement_starting 10 client_app_name 44 sqlserver sp_statement_starting 11 server_principal_name 44 sqlserver sp_statement_starting 12 session_id 45 sqlserver sp_statement_completed 6 nt_username 45 sqlserver sp_statement_completed 9 client_pid 45 sqlserver sp_statement_completed 10 client_app_name 45 sqlserver sp_statement_completed 11 server_principal_name 45 sqlserver sp_statement_completed 12 session_idOm du vill konvertera detta till motsvarande extended events läggs sqlserver.sp_statement_starting och sqlserver.sp_statement_completed händelser till, med en lista över åtgärder. Predikat ingår som WHERE-satser.
ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 )Lägg till det asynkrona filmålet och ersätt filsökvägarna med den plats där du vill spara utdata. När du anger filmålet måste du inkludera en loggfil och en sökvägsfil för metadatafiler.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Så här visar du resultatet
Du kan använda funktionen sys.fn_xe_file_target_read_file för att visa utdata. Det gör du genom att köra följande fråga och ersätta filsökvägarna med de sökvägar som du har angett:
SELECT *, CAST(event_data as XML) AS 'event_data_XML' FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);Anmärkning
Det är valfritt att konvertera händelsedata som XML.
Mer information om funktionen sys.fn_xe_file_target_read_file finns i sys.fn_xe_file_target_read_file (Transact-SQL).
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [session_name] ON SERVER; CREATE EVENT SESSION [session_name] ON SERVER ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 ); ADD TARGET package0.asynchronous_file_target (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Example
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')
DROP EVENT SESSION [session_name] ON SERVER;
CREATE EVENT SESSION [session_name]
ON SERVER
ADD EVENT sqlserver.sp_statement_starting
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59
),
ADD EVENT sqlserver.sp_statement_completed
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59 AND duration > 0
)
ADD TARGET package0.asynchronous_file_target
(SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Se även
Visa ekvivalenter för utökade händelser till SQL Trace Event-klasser