Sql server SQL事件探查器跟踪-为什么存储过程中的函数列为Showplan XML和SP:Completed的两倍

Sql server SQL事件探查器跟踪-为什么存储过程中的函数列为Showplan XML和SP:Completed的两倍,sql-server,stored-procedures,trace,sql-server-profiler,Sql Server,Stored Procedures,Trace,Sql Server Profiler,我可能有一个非常简单的问题。我已经开始学习如何分析MSSQL数据库,并创建了一个跟踪模板 作为测试,我尝试调用一个简单的存储过程,其中包含对函数的一次调用 当我运行程序并检查跟踪时,会列出7个事件。但是,我可以看到该函数的事件Showplan XML和SP:con完成了两次。第一个SP:Completed的持续时间为0,第二个SP:Completed的持续时间为2 我的问题是,当函数本身在存储过程中只被调用一次时,为什么该函数会列出两次这些事件 /************************

我可能有一个非常简单的问题。我已经开始学习如何分析MSSQL数据库,并创建了一个跟踪模板

作为测试,我尝试调用一个简单的存储过程,其中包含对函数的一次调用

当我运行程序并检查跟踪时,会列出7个事件。但是,我可以看到该函数的事件Showplan XML和SP:con完成了两次。第一个SP:Completed的持续时间为0,第二个SP:Completed的持续时间为2

我的问题是,当函数本身在存储过程中只被调用一次时,为什么该函数会列出两次这些事件

/****************************************************/
/* Created by: SQL Server 2008 R2 Profiler          */
/* Date: 10/04/2014  07:18:07 PM         */
/****************************************************/


-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5 

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL 
if (@rc != 0) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 122, 1, @on
exec sp_trace_setevent @TraceID, 122, 25, @on
exec sp_trace_setevent @TraceID, 122, 2, @on
exec sp_trace_setevent @TraceID, 122, 10, @on
exec sp_trace_setevent @TraceID, 122, 14, @on
exec sp_trace_setevent @TraceID, 122, 34, @on
exec sp_trace_setevent @TraceID, 122, 11, @on
exec sp_trace_setevent @TraceID, 122, 35, @on
exec sp_trace_setevent @TraceID, 122, 51, @on
exec sp_trace_setevent @TraceID, 122, 12, @on
exec sp_trace_setevent @TraceID, 122, 29, @on
exec sp_trace_setevent @TraceID, 10, 15, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 48, @on
exec sp_trace_setevent @TraceID, 10, 1, @on
exec sp_trace_setevent @TraceID, 10, 17, @on
exec sp_trace_setevent @TraceID, 10, 2, @on
exec sp_trace_setevent @TraceID, 10, 10, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 10, 34, @on
exec sp_trace_setevent @TraceID, 10, 11, @on
exec sp_trace_setevent @TraceID, 10, 35, @on
exec sp_trace_setevent @TraceID, 10, 51, @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 43, 15, @on
exec sp_trace_setevent @TraceID, 43, 48, @on
exec sp_trace_setevent @TraceID, 43, 1, @on
exec sp_trace_setevent @TraceID, 43, 10, @on
exec sp_trace_setevent @TraceID, 43, 34, @on
exec sp_trace_setevent @TraceID, 43, 11, @on
exec sp_trace_setevent @TraceID, 43, 35, @on
exec sp_trace_setevent @TraceID, 43, 51, @on
exec sp_trace_setevent @TraceID, 43, 12, @on
exec sp_trace_setevent @TraceID, 43, 13, @on
exec sp_trace_setevent @TraceID, 43, 29, @on
exec sp_trace_setevent @TraceID, 43, 14, @on
exec sp_trace_setevent @TraceID, 12, 15, @on
exec sp_trace_setevent @TraceID, 12, 16, @on
exec sp_trace_setevent @TraceID, 12, 48, @on
exec sp_trace_setevent @TraceID, 12, 1, @on
exec sp_trace_setevent @TraceID, 12, 17, @on
exec sp_trace_setevent @TraceID, 12, 10, @on
exec sp_trace_setevent @TraceID, 12, 14, @on
exec sp_trace_setevent @TraceID, 12, 18, @on
exec sp_trace_setevent @TraceID, 12, 11, @on
exec sp_trace_setevent @TraceID, 12, 35, @on
exec sp_trace_setevent @TraceID, 12, 51, @on
exec sp_trace_setevent @TraceID, 12, 12, @on
exec sp_trace_setevent @TraceID, 12, 13, @on
exec sp_trace_setevent @TraceID, 13, 12, @on
exec sp_trace_setevent @TraceID, 13, 1, @on
exec sp_trace_setevent @TraceID, 13, 10, @on
exec sp_trace_setevent @TraceID, 13, 14, @on
exec sp_trace_setevent @TraceID, 13, 11, @on
exec sp_trace_setevent @TraceID, 13, 35, @on
exec sp_trace_setevent @TraceID, 13, 51, @on


-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
exec sp_trace_setfilter @TraceID, 35, 0, 6, N'xxxxxxxx'
-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1

-- display trace id for future references
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go

谢谢。

您可以发布跟踪创建脚本吗?从探查器中,为SQL Server选择文件-->导出-->脚本跟踪定义-->我创建了一个标量函数和一个选择函数值的过程。然后,我从SSMS执行了该过程,看到了5个事件:SQL:BatchStarting(用于批处理)、Showplan XML(用于功能计划)、SP:Completed(用于功能)、SP:Completed(用于过程)和SP:Completed(用于批处理)。您没有看到存储过程的SP:Completed吗?复制的Showplan XML是否是相同的计划(对于函数)?我正在运行同样来自SSMS的SP调用。当我这样做时,我得到的是:我正在运行SP调用,也来自SSMS。当我这样做时,我得到了以下信息:1个SQL:BatchStarting,2个SQL:BatchCompleted(都用于[DB_NAME],3个SQL:BatchStarting(返回值声明+SP调用),4个Showplan XML(SP),5个Showplan XML(函数),6个SP:Completed(函数,持续时间2),7个Showplan XML(再次使用函数),8个SP:Completed(再次使用函数,持续时间0),9个SP:Completed(过程),10 SQL:BatchCompleted(返回值声明+SP调用),函数和SP都返回XML。该函数的Showplan XML看起来相同。