我已经在我们的数据库上设置了一个存储过程跟踪器表,希望使用它来清除我们不再使用的过程。我几个月前就开始这样做了,现在我已经准备好开始清洁了。这些表使用SQL Server 2008 R2中的sys.procedures
和sys.dm_exec_procedure_stats
DMV,并且作业每10小时,每天24小时更新静态表
我一直在检查我的程序清单,并且遇到了一些我知道的事实已经运行的事情。我找到的特定一个作为作业的第2步运行,但sys.dm_exec_procedure_stats
似乎不包含已运行的任何记录,但步骤1中的过程已在正确的时间出现。我已经检查了工作历史,第1步和第2步都没有遇到任何问题。
我能看到的唯一区别是步骤2中的过程出现了一个"警告:Null值被聚合或其他SET操作消除了#34;而第一步没有。这是否会影响该程序是否会出现在sys.dm_exec_procedure_stats
?
希望有人可以提供帮助!
答案 0 :(得分:0)
虽然它没有出现在DMV中的原因可能是@ bastos.sergio在对该问题的评论中提到的链接/相关答案中指出的原因,但仍然存在“可以是什么”的问题。找到没有被使用的过程?“。
该链接问题中接受的答案(这是@ bastos.sergio引用的问题:Last Run Date on a Stored Procedure in SQL Server)遗漏了一些内容,所以我将在此处添加:
ONLY 了解调用内容的方法是:
RAISERROR(N'Deprecated! Please contact YourName.', 16, 1); RETURN;
并将其保留一两个月。RAISERROR(...); RETURN;
。 修改强>
回答以下具体问题:
“警告:Null值是否被聚合或其他SET操作消除”警告:在存储过程中运行但未显示在DMV中的查询与它未显示的原因有关在DMV?
进行以下测试:
CREATE PROCEDURE #NoWarning
AS
SELECT AVG(tmp.col)
FROM (
SELECT 1.0
UNION ALL
SELECT 2
) tmp(col);
GO
EXEC #NoWarning;
GO
CREATE PROCEDURE #Warning
AS
SELECT AVG(tmp.col)
FROM (
SELECT 1.0
UNION ALL
SELECT null
) tmp(col);
GO
EXEC #Warning;
然后运行以下查询,您应该看到两个proc名称出现在“tempdb”中:
SELECT DB_NAME(ps.database_id) AS [DatabaseName],
OBJECT_NAME(ps.[object_id], ps.database_id) AS [ProcName],
*
FROM sys.dm_exec_procedure_stats ps
ORDER BY [DatabaseName], [ProcName];