寻求有关扩展事件行为的帮助

Rit*_*kre 2 sql-server extended-events sql-server-2012

我正在使用扩展事件来跟踪服务器上正在执行的过程及其执行程序的主机名。

我使用了以下 XE 脚本:

CREATE EVENT SESSION [EXEC_SP] ON SERVER 
ADD EVENT sqlserver.sp_statement_completed
(
  SET collect_statement=(0)
  ACTION
  (
    sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,
    sqlserver.nt_username,sqlserver.server_instance_name,
    sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,
    sqlserver.transaction_id,sqlserver.username
  )
  WHERE ( [sqlserver].[is_system]=(0))
)
 ADD TARGET package0.asynchronous_file_target
 (
   SET FILENAME = N'C:\EXEC_SP.xel',
   METADATAFILE = N'C:\EXEC_SP.xem'
 )
 WITH
 (
   MAX_MEMORY=4096KB,
   EVENT_RETENTION_MODE=NO_EVENT_LOSS,
   MAX_DISPATCH_LATENCY=15 SECONDS,
   TRACK_CAUSALITY=OFF,
    STARTUP_STATE=ON
 );
Run Code Online (Sandbox Code Playgroud)

但是,正在执行的过程主体内的每个语句都在目标处构成一行。

例如,如果我的程序主体中有 5 个语句,则该事件将被触发 5 次,并且在目标处将有 5 个不同的条目对应于相同的条目。

我只为每个正在执行的过程寻找一个条目,而不是多个条目。

也就是说,正在执行的每个过程都应该只构成 1 行而不是多行。

如何解决这个问题?

Aar*_*and 5

sp_statement_completed 正在按照您的要求执行操作:为过程中的每个语句触发。

您可能想将其更改为sqlserver.module_end- 但您的会话中的其他一些内容似乎与您所追求的内容不符,例如transaction_id,实例名称何时会有所不同,并且同时捕获两者database_id并且database_name有点多余(除非您是不断删除和重新创建数据库,您可以从另一个派生出一个,但我认为数据库名称更有用)。也许:

CREATE EVENT SESSION [EXEC_SP] ON SERVER 
ADD EVENT sqlserver.module_end
(
  SET collect_statement=(0)
  ACTION
  (
    sqlserver.client_hostname,
    sqlserver.database_name,
    sqlserver.nt_username,
    sqlserver.server_principal_name,
    sqlserver.session_id,
    sqlserver.sql_text,
    sqlserver.username
  )
  WHERE ( [sqlserver].[is_system]=(0))
)
 ADD TARGET package0.asynchronous_file_target
 (
   SET FILENAME = N'C:\EXEC_SP.xel',
   METADATAFILE = N'C:\EXEC_SP.xem'
 )
 WITH
 (
   MAX_MEMORY = 4096KB,
   EVENT_RETENTION_MODE = NO_EVENT_LOSS,
   MAX_DISPATCH_LATENCY = 15 SECONDS,
   TRACK_CAUSALITY = OFF,
   STARTUP_STATE = ON
 );
Run Code Online (Sandbox Code Playgroud)