Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Als u een bestaand SQL Trace-script hebt dat u wilt converteren naar een sessie met uitgebreide gebeurtenissen, kunt u de procedures in dit onderwerp gebruiken om een equivalente uitgebreide gebeurtenissensessie te maken. Met behulp van de informatie in de trace_xe_action_map- en trace_xe_event_map systeemtabellen kunt u de informatie verzamelen die u nodig hebt om de conversie uit te voeren.
De stappen omvatten het volgende:
Voer het bestaande script uit om een SQL Trace-sessie te maken en haal vervolgens de id van de tracering op.
Voer een query uit die gebruikmaakt van de fn_trace_geteventinfo-functie om de overeenkomstige Extended Events-gebeurtenissen en -acties voor elke SQL Trace-gebeurtenisklasse en de bijbehorende kolommen te vinden.
Gebruik de functie fn_trace_getfilterinfo om de filters en de equivalente acties voor uitgebreide gebeurtenissen weer te geven die moeten worden gebruikt.
Maak handmatig een Extended Events-sessie aan, met gebruik van de equivalente Extended Events-gebeurtenissen, -acties en -predicaten (filters).
Om de trace-ID te verkrijgen
Open het SQL Trace-script in Query-editor en voer vervolgens het script uit om de traceringssessie te maken. Houd er rekening mee dat de traceringssessie niet hoeft te worden uitgevoerd om deze procedure te voltooien.
Haal de ID van de trace op. Gebruik hiervoor de volgende query:
SELECT * FROM sys.traces; GOOpmerking
Trace-id 1 geeft doorgaans de standaardtracering aan.
De equivalenten voor uitgebreide gebeurtenissen bepalen
Als u de equivalente gebeurtenissen en acties voor uitgebreide gebeurtenissen wilt bepalen, voert u de volgende query uit, waarbij trace_id is ingesteld op de waarde van de tracerings-id die u in de vorige procedure hebt verkregen.
Opmerking
In dit voorbeeld wordt de tracerings-id voor de standaardtracering (1) gebruikt.
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;De equivalente gebeurtenis-id voor uitgebreide gebeurtenissen, pakketnaam, gebeurtenisnaam, kolom-id en actienaam worden geretourneerd. U gebruikt deze uitvoer in de procedure 'Een sessie voor uitgebreide gebeurtenissen maken' verderop in dit onderwerp.
In sommige gevallen wordt de gefilterde kolom toegewezen aan een gebeurtenisgegevensveld dat standaard is opgenomen in de gebeurtenis Uitgebreide gebeurtenissen. Daarom is de kolom 'Extended_Events_action_name' NULL. Als dit gebeurt, moet u het volgende doen om te bepalen welk gegevensveld gelijk is aan de gefilterde kolom:
Voor de acties die NULL retourneren, identificeert u welke SQL Trace-gebeurtenisklassen in het script de kolom bevatten die wordt gefilterd.
U hebt bijvoorbeeld de gebeurtenisklasse SP:StmtCompleted gebruikt en een filter opgegeven voor de naam van de duurtraceringskolom (SQL Trace-gebeurtenisklasse-id 45 en SQL Trace-kolom-id 13). In dit geval wordt de actienaam weergegeven als NULL in de queryresultaten.
Voor elke SQL Trace-gebeurtenisklasse die u in de vorige stap hebt geïdentificeerd, zoekt u de equivalente gebeurtenisnaam voor uitgebreide gebeurtenissen. (Als u niet zeker weet van de equivalente gebeurtenisnaam, gebruikt u de query in het onderwerp De uitgebreide gebeurtenissen die equivalenten zijn voor SQL Trace Event Classes weergeven.)
Gebruik de volgende query om de juiste gegevensvelden te identificeren die moeten worden gebruikt voor de gebeurtenissen die u in de vorige stap hebt geïdentificeerd. De query toont de gegevensvelden van de uitgebreide gebeurtenissen in de kolom 'event_field'. Vervang <in de query event_name> door de naam van een gebeurtenis die u in de vorige stap hebt opgegeven.
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>';De gebeurtenisklasse SP:StmtCompleted wordt bijvoorbeeld toegewezen aan de uitgebreide gebeurtenis sp_statement_completed. Als u sp_statement_completed opgeeft als de gebeurtenisnaam in de query, worden in de kolom event_field de velden weergegeven die standaard zijn opgenomen in de gebeurtenis. Als u de velden bekijkt, ziet u dat er een "duur" veld is. Als u het filter wilt maken in de equivalente sessie met uitgebreide gebeurtenissen, voegt u een predicaat toe, zoals WHERE duration > 0. Voor een voorbeeld kunt u de procedure "To create the Extended Events session" in dit onderwerp raadplegen.
Om de sessie Uitgebreide Gebeurtenissen te maken
Gebruik De Query-editor om de sessie Uitgebreide gebeurtenissen te maken en de uitvoer naar een bestandsdoel te schrijven. In de volgende stappen wordt één query beschreven, met uitleg over het bouwen van de query. Zie de sectie 'Voorbeeld' van dit onderwerp voor het volledige queryvoorbeeld.
Voeg instructies toe om de gebeurtenissessie te maken, waarbij session_name vervangt door de naam die u wilt gebruiken voor de sessie Uitgebreide Gebeurtenissen.
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;Voeg de uitgebreide gebeurtenissen en acties toe die zijn geretourneerd als uitvoer in de procedure 'De equivalenten voor uitgebreide gebeurtenissen bepalen' en voeg de predicaten (filters) toe die u hebt geïdentificeerd in de procedure 'De filters bepalen die in het script zijn gebruikt'.
In het volgende voorbeeld wordt een SQL Trace-script gebruikt dat de gebeurtenisklassen SQL:StmtStarting en SP:StmtCompleted bevat, met filters voor sessie-id en duur. Voorbeelduitvoer voor de query in de procedure 'De equivalenten voor uitgebreide gebeurtenissen bepalen' heeft de volgende resultatenset geretourneerd:
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_idAls u dit wilt converteren naar het equivalent van uitgebreide gebeurtenissen, worden de sqlserver.sp_statement_starting en de sqlserver.sp_statement_completed gebeurtenissen toegevoegd, met een lijst met acties. Predicaatuitdrukkingen worden opgenomen als WHERE-clausules.
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 )Voeg het asynchrone bestandsdoel toe, waarbij u de bestandspaden vervangt door de locatie waar u de uitvoer wilt opslaan. Wanneer u het bestandsdoel opgeeft, moet u een logboekbestand en bestandspadbestand voor metagegevens opnemen.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
De resultaten weergeven
U kunt de functie sys.fn_xe_file_target_read_file gebruiken om de uitvoer weer te geven. Voer hiervoor de volgende query uit, waarbij u de bestandspaden vervangt door de paden die u hebt opgegeven:
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);Opmerking
Het casten van de gebeurtenisgegevens als XML is optioneel.
Zie sys.fn_xe_file_target_read_file (Transact-SQL) voor meer informatie over de functie sys.fn_xe_file_target_read_file.
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');
Zie ook
De uitgebreide gebeurtenissen die equivalenten zijn van SQL Trace-gebeurtenisklassen weergeven