我们在SQL Server 2005中有一个存储过程,其中包含一些复杂的单选查询。最近在一个环境中,我们注意到对于存储过程返回的结果的一小部分,存在重复记录。当我们直接运行sql查询时,我们得到了正确的记录集,没有任何重复。存储过程使用大量视图和连接(内连接/左连接)。我的一个理论是,不知何故,存储过程使用了一些缓存的执行计划,因为我们最近修改了一些视图,但是我没有足够的SQL专业知识来确保这一点。有人有任何想法吗?
感谢您的帮助, 阿希什
答案 0 :(得分:1)
不同的连接设置可能会导致不同的结果(例如ansi_nulls,arith_abort等)。
答案 1 :(得分:0)
在存储过程上运行sp_recompile以清除该存储过程的过程高速缓存。
清除整个过程缓存执行
DBCC FREEPROCCACHE
以下是重新编译的示例,如果您想将其放入可重复使用的脚本中:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Object: Maintenance - StoredProcedure [Sample].[SampleSearch] Script Date: 07/28/2011 14:15:15 ******/
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'Sample' AND ROUTINE_NAME = 'Sampleearch'))
BEGIN
PRINT 'Marking procedure [Sample].[SampleSearch] for recompile'
EXEC sp_recompile 'Sample.SampleSearch'
PRINT 'Finished marking procedure [Sample].[SampleSearch] for recompile'
END
GO
但是,如果查询返回不同的结果,可能会打开SQL跟踪或调试代码中的调用,以确保在两种情况下都使用相同的in和out参数。