使用以下脚本,我已经尝试重新编译数据库上的所有存储过程,因为我们正在升级到SQL Server 2012(从2005年开始),我想事先确定它们不是&# 39; t break。
DECLARE @schema VARCHAR(20),
@spName VARCHAR(MAX),
@fullName VARCHAR(MAX)
DECLARE storedProcedureCursor CURSOR FOR
SELECT SPECIFIC_SCHEMA, SPECIFIC_NAME
FROM ASZ_GWZ.information_schema.routines
WHERE routine_type = 'PROCEDURE'
OPEN storedProcedureCursor
FETCH NEXT FROM storedProcedureCursor INTO @schema, @spName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fullName = @schema + '.' + @spName
EXEC sp_recompile @objname = @fullName
FETCH NEXT FROM storedProcedureCursor INTO @schema, @spName
END
CLOSE storedProcedureCursor
DEALLOCATE storedProcedureCursor
不幸的是,结果与我的预期略有不同,因为存储过程只有标记为才能重新编译,并且实际上没有重新编译。
对象' dbo.xyz'已成功标记为重新编译。
如何真正重新编译所有(或现在所有重新编译标记的)存储过程?
提前致谢
答案 0 :(得分:1)
您必须运行存储过程才能重新编译。编译存储过程基本上意味着存储过程的执行计划被缓存。无论您使用sp_recompile还是创建存储过程WITH RECOMPILE
,您只需告诉SQL需要重新缓存执行计划。该sp_recompile仅删除现有的执行计划。
sp_recompile系统存储过程强制重新编译a 下次运行时存储过程。它通过这样做 从过程高速缓存中删除现有计划,强制执行新计划 在下次运行程序时创建。
更多信息:https://msdn.microsoft.com/en-us/library/ms190439(v=sql.110).aspx