首页 > 解决方案 > SQL Server 存储过程不在计划缓存或 Profiler 中

问题描述

我无法确定为什么某个存储过程没有出现在计划缓存或 SQL Server Profiler 中。我正在运行 SQL Server 2014 SP2。

存储过程和类型如下所示。我发现的唯一可能有用的参考提到了 SS 2008 中的错误修复,其中在字符串函数中使用了 blob。我ntext在类型定义中有一个 blob ( )。这可能是原因或以某种方式相关吗?如果不是,还有什么可能导致这种行为?有没有办法让存储过程缓存和/或显示在分析器中?

CREATE TYPE [dbo].[OruMessages] AS TABLE
(
    [msg_status] [nchar](10) NOT NULL,
    [msg_no] [char](20) NOT NULL,
    [HL7_text_long] [ntext] NULL,
    [HL7_text_short] [nvarchar](255) NULL,
    [patient_id] [nvarchar](60) NULL,
    [msh_system] [nvarchar](50) NOT NULL,
    [msh_organization] [nvarchar](50) NOT NULL,
    [msh_event_cd] [nchar](10) NOT NULL,
    [msh_msg_type] [nchar](10) NOT NULL,
    [sent_dt] [datetime] NULL,
    [queued_dt] [datetime] NOT NULL
)
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[usp_HL7_SaveOruMessages]
    (@messageList [dbo].[OruMessages] READONLY)
AS
BEGIN
    INSERT  INTO [dbo].[HL7_out_queue]
    SELECT
        [msg_status],
        [msg_no],
        [HL7_text_long],
        [HL7_text_short],
        [patient_id],
        [msh_system],
        [msh_organization],
        [msh_event_cd],
        [msh_msg_type],
        [sent_dt],
        [queued_dt]
    FROM
        @messageList;
END;
GO


CREATE EVENT SESSION [Capture [usp_HL7_SaveOruMessages]] executions] ON SERVER 
ADD EVENT sqlserver.module_end(
    ACTION(sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[database_name]=N'db' AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%usp_HL7_SaveOruMessages%'))),
ADD EVENT sqlserver.module_start(
    ACTION(sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[database_name]=N'db' AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%usp_HL7_SaveOruMessages%'))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'db') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%usp_HL7_SaveOruMessages%') )),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'db') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%usp_HL7_SaveOruMessages%') ))
ADD TARGET package0.event_file(SET filename=N'C:\db\Capture [usp_HL7_SaveOruMessages] executions')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

标签: sql-servercachingstored-proceduressql-server-profiler

解决方案


这是最终更改的扩展事件会话,它为我提供了来自主机的所有 RPC、批处理和模块调用,然后我能够找到有问题的存储过程。

CREATE EVENT SESSION [<MachineName>] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[client_hostname]=N'<MachineName>')),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[client_hostname]=N'<MachineName>')),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[client_hostname]=N'<MachineName>'))
ADD TARGET package0.event_file(SET filename=N'C:\ExtEvents\<MachineName>.xel',max_file_size=(5120))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)

推荐阅读