SQL Profiler - 使用 HostName 过滤器编写跟踪脚本

Mar*_*ith 7 sql-server-2005 sql-server-2008 profiler

我有大量用于不同级别诊断的脚本化跟踪定义,其中没有一个是按 HostName 过滤的。我今天需要按主机过滤流量,因此:

  1. 启动 Profiler
  2. 创建了一个空的跟踪
  3. 添加 SP:开始/完成
  4. 在主机名上设置过滤器
  5. 脚本化到 test.sql 文件

在 SSMS 中打开文件,没有过滤器的迹象。冲洗,重复,再次相同。假设我正在做一些愚蠢的事情,我查找要使用的值(比它应该更难找到!)并手动添加到我的跟踪定义中,这有效。

EXEC sp_trace_setfilter @TraceId, 8, 0, 6, N'MyHostName'
Run Code Online (Sandbox Code Playgroud)

回来检查为什么我无法从 Profiler 中获得相同的结果。我发现在从 SSMS 编写 2000 年的脚本跟踪时提到这是一个问题,但没有提到 SSMS2005/2008 到 2005/2008 服务器的这种情况。这是 Profiler 中的错误吗?

小智 6

在 Profiler 2005 中生成脚本时,为逻辑运算符保存的默认值为 1='OR',因此跟踪将捕获比我们最初预期的更多的信息。

exec sp_trace_setfilter @TraceID, 8, 1, 0, N'HOSTNAME1'    -- OR 
exec sp_trace_setfilter @TraceID, 8, 1, 0, N'HOSTNAME2'
exec sp_trace_setfilter @TraceID, 8, 1, 0, N'HOSTNAME3'
set @bigintfilter = 10 -- reads >= 10
exec sp_trace_setfilter @TraceID, 16, 0, 4, @bigintfilter  -- AND
exec sp_trace_setfilter @TraceID, 35, 1, 6, N'DB'          -- OR
Run Code Online (Sandbox Code Playgroud)

在 Profiler >=2008 中,脚本为第一次出现要过滤的列提供 0(AND)。

exec sp_trace_setfilter @TraceID, 8, 0, 0, N'HOSTNAME1'    -- AND               
exec sp_trace_setfilter @TraceID, 8, 1, 0, N'HOSTNAME2'  
exec sp_trace_setfilter @TraceID, 8, 1, 0, N'HOSTNAME3' 
exec sp_trace_setfilter @TraceID, 35,0, 6, N'DB'           -- AND                
set @bigintfilter = 10 -- reads
exec sp_trace_setfilter @TraceID, 16, 0, 4, @bigintfilter  -- AND
Run Code Online (Sandbox Code Playgroud)

这看起来像是 Profiler 2005 中的一个错误。