Convertire uno script di Traccia SQL esistente in una sessione Eventi estesiConvert an Existing SQL Trace Script to an Extended Events Session

In questo argomento si applica a: SìSQL ServerSìDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Se si dispone di uno script di Traccia SQL esistente che si desidera convertire in una sessione Eventi estesi, è possibile utilizzare le procedure descritte in questo argomento per creare una sessione Eventi estesi equivalente.If you have an existing SQL Trace script that you want to convert to an Extended Events session, you can use the procedures in this topic to create an equivalent Extended Events session. Usando le informazioni contenute nelle tabelle di sistema trace_xe_action_map e trace_xe_event_map, è possibile raccogliere le informazioni necessarie per la conversione.By using the information in the trace_xe_action_map and trace_xe_event_map system tables, you can collect the information that you must have to do the conversion.

I passaggi necessari sono i seguenti:The steps include the following:

  1. Eseguire lo script esistente per creare una sessione di Traccia SQL, quindi ottenere l'ID della traccia.Execute the existing script to create a SQL Trace session, and then obtain the ID of the trace.

  2. Eseguire una query che usi la funzione fn_trace_geteventinfo per trovare gli eventi e le azioni equivalenti degli eventi estesi per ogni classe di evento di Traccia SQL e per le colonne associate.Run a query that uses the fn_trace_geteventinfo function to find the equivalent Extended Events events and actions for each SQL Trace event class and its associated columns.

  3. Usare la funzione fn_trace_getfilterinfo per elencare i filtri e le azioni equivalenti degli eventi estesi da usare.Use the fn_trace_getfilterinfo function to list the filters and the equivalent Extended Events actions to use.

  4. Creare manualmente una sessione Eventi estesi, utilizzando gli eventi, le azioni e i predicati (filtri) equivalenti degli eventi estesi.Manually create an Extended Events session, using the equivalent Extended Events events, actions, and predicates (filters).

Per ottenere l'ID della tracciaTo obtain the trace ID

  1. Aprire lo script di Traccia SQL nell'editor di query e quindi eseguire lo script per creare la sessione di traccia.Open the SQL Trace script in Query Editor, and then execute the script to create the trace session. Si noti che non è necessario che la sessione di traccia sia in esecuzione per completare questa procedura.Note that the trace session does not need to be running to complete this procedure.

  2. Ottenere l'ID della traccia.Obtain the ID of the trace. A tale scopo, utilizzare la query seguente:To do this, use the following query:

    SELECT * FROM sys.traces;  
    GO  
    

    Nota

    L'ID di traccia 1 indica in genere la traccia predefinita.Trace ID 1 typically indicates the default trace.

Per determinare gli equivalenti degli eventi estesiTo determine the Extended Events equivalents

  1. Per determinare gli eventi equivalenti degli eventi estesi, eseguire la query seguente, dove trace_id è impostato sul valore dell'ID di traccia ottenuto nella procedura descritta in precedenza.To determine the equivalent Extended Events events and actions, run the following query, where trace_id is set to the value of the trace ID that you obtained in the previous procedure.

    Nota

    In questo esempio, viene utilizzato l'ID della traccia predefinita (1).In this example, the trace ID for the default trace (1) is used.

    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;  
    

    Vengono restituiti l'ID di evento, il nome di pacchetto, il nome di evento, l'ID di colonna e il nome di azione equivalenti degli eventi estesi.The equivalent Extended Events event ID, package name, event name, column ID and action name are returned. Questo output verrà utilizzato nella procedura "Per creare la sessione Eventi estesi", più avanti in questo argomento.You will use this output in the procedure "To create the Extended Events session" later in this topic.

    In alcuni casi, per la colonna filtrata viene eseguito il mapping a un campo dati di evento incluso per impostazione predefinita nell'evento di eventi estesi.In some cases, the filtered column maps to an event data field that is included by default in the Extended Events event. La colonna "Extended_Events_action_name" sarà pertanto NULL.Therefore, the "Extended_Events_action_name" column will be NULL. Se questo si verifica, è necessario effettuare le operazioni seguenti per determinare il campo dati equivalente alla colonna filtrata:If this occurs, you must do the following to determine which data field is equivalent to the filtered column:

    1. Per le azioni che restituiscono NULL, identificare le classi di eventi di Traccia SQL nello script che contengono la colonna filtrata.For the actions that return NULL, identify which SQL Trace event classes in the script contain the column that is being filtered.

      È possibile ad esempio che sia stata usata la classe di evento SP:StmtCompleted e sia stato specificato un filtro sul nome della colonna di traccia Duration (ID classe di evento di Traccia SQL 45 e ID colonna di Traccia SQL 13).For example, you may have used the SP:StmtCompleted event class, and specified a filter on the Duration trace column name (SQL Trace event class ID 45, and SQL Trace column ID 13). In questo caso, il nome dell'azione verrà visualizzato come NULL nei risultati della query.In this case, the action name will appear as NULL in the query results.

    2. Per ogni classe di evento di Traccia SQL identificata nel passaggio precedente, trovare il nome dell'evento equivalente degli eventi estesi.For each SQL Trace event class that you identified in the previous step, find the equivalent Extended Events event name. Se non si conosce il nome dell'evento equivalente, usare la query nell'argomento Visualizzare gli eventi estesi equivalenti alle classi di evento di traccia SQL.(If you are not sure of the equivalent event name, use the query in the topic View the Extended Events Equivalents to SQL Trace Event Classes.)

    3. Utilizzare la query seguente per identificare i campi dati corretti da utilizzare per gli eventi identificati nel passaggio precedente.Use the following query to identify the correct data fields to use for the events that you identified in the previous step. Nella query i campi dati degli eventi estesi sono riportati nella colonna "event_field".The query shows the Extended Events data fields in the "event_field" column. Nella query sostituire <event_name> con il nome di un evento specificato nel passaggio precedente.In the query, replace <event_name> with the name of an event that you specified in the previous step.

      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>';  
      

      Ad esempio, la classe di evento SP:StmtCompleted esegue il mapping all'evento sp_statement_completed degli eventi estesi.For example, the SP:StmtCompleted event class maps to the sp_statement_completed Extended Events event. Se si specifica sp_statement_completed come nome di evento nella query, nella colonna "event_field" vengono visualizzati i campi inclusi per impostazione predefinita nell'evento.If you specify sp_statement_completed as the event name in the query, the "event_field" column shows the fields that are included by default with the event. Analizzando i campi, è possibile notare un campo relativo alla durata ("duration").Looking at the fields, you can see that there is a "duration" field. Per creare il filtro nella sessione Eventi estesi equivalente, è necessario aggiungere un predicato, ad esempio "WHERE duration > 0".To create the filter in the equivalent Extended Events session, you would add a predicate such as "WHERE duration > 0". Per un esempio, vedere la procedura "Per creare la sessione Eventi estesi", più avanti in questo argomento.For an example, see the "To create the Extended Events session" procedure in this topic.

Per creare la sessione Eventi estesiTo create the Extended Events session

Utilizzare l'editor di query per creare la sessione Eventi estesi e scrivere l'output in una destinazione file.Use Query Editor to create the Extended Events session, and to write the output to a file target. Nei passaggi seguenti viene descritta una singola query e viene illustrato come compilarla.The following steps describe a single query, with explanations to show you how to build the query. Per l'esempio di query completo, vedere la sezione "Esempio" di questo argomento.For the full query example, see the "Example" section of this topic.

  1. Aggiungere istruzioni per creare la sessione eventi, sostituendosession_name con il nome che si desidera utilizzare per la sessione Eventi estesi.Add statements to create the event session, replacing session_name with the name that you want to use for the Extended Events session.

    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;  
    
  2. Aggiungere gli eventi e le azioni degli eventi estesi restituiti come output nella procedura "Per determinare gli equivalenti degli eventi estesi" e aggiungere i predicati (filtri) identificati nella procedura "Per determinare i filtri utilizzati nello script".Add the Extended Events events and actions that were returned as output in the procedure "Determine the Extended Events equivalents", and add the predicates (filters) that you identified in the procedure "To determine the filters that were used in the script".

    Nell'esempio seguente viene usato uno script di Traccia SQL che include le classi di eventi StmtStarting e SP:StmtCompleted, con i filtri per ID sessione e durata.The following example uses a SQL Trace script that includes the SQL:StmtStarting and SP:StmtCompleted event classes, with filters for session ID and duration. L'output di esempio per la query nella procedura "Per determinare gli equivalenti degli eventi estesi" ha restituito il set di risultati seguente:Sample output for the query in the "Determine the Extended Events equivalents" procedure returned the following result set:

    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_id  
    

    Per eseguire la conversione dell'elemento nell'equivalente degli eventi estesi, vengono aggiunti gli eventi sqlserver.sp_statement_starting e sqlserver.sp_statement_completed, con un elenco di azioni.To convert this to the Extended Events equivalent, the sqlserver.sp_statement_starting and the sqlserver.sp_statement_completed events are added, with a list of actions. Le istruzioni dei predicati sono incluse come clausole WHERE.Predicate statements are included as WHERE clauses.

    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  
       )  
    
  3. Aggiungere la destinazione file asincrona, sostituendo i percorsi di file con il percorso in cui si desidera salvare l'output.Add the asynchronous file target, replacing the file paths with the location where you want to save the ouput. Quando si specifica la destinazione file, è necessario includere un file di percorso del file di log e del file di metadati.When specifying the file target, you must include a log file and metadata file path file.

    ADD TARGET package0.asynchronous_file_target(  
       SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Per visualizzare i risultatiTo view the results

  1. È possibile usare la funzione sys.fn_xe_file_target_read_file per visualizzare l'output.You can use the sys.fn_xe_file_target_read_file function to view the output. A tale scopo, eseguire la query seguente, sostituendo i percorsi di file con i percorsi specificati:To do this, run the following query, replacing the file paths with the paths that you specified:

    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);  
    

    Nota

    L'esecuzione del cast dei dati degli eventi in formato XML è facoltativa.Casting the event data as XML is optional.

    Per altre informazioni sulla funzione sys.fn_xe_file_target_read_file, vedere sys.fn_xe_file_target_read_file (Transact-SQL).For more information about the sys.fn_xe_file_target_read_file function, see 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');  
    

EsempioExample

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');  

Vedere ancheSee Also

Visualizzare gli eventi estesi equivalenti alle classi di evento di traccia SQLView the Extended Events Equivalents to SQL Trace Event Classes