SQL Server重新编译标记的存储过程

时间:2015-10-29 14:07:22

标签: sql-server tsql stored-procedures

使用以下脚本,我已经尝试重新编译数据库上的所有存储过程,因为我们正在升级到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'已成功标记为重新编译。

如何真正重新编译所有(或现在所有重新编译标记的)存储过程?

提前致谢

1 个答案:

答案 0 :(得分:1)

您必须运行存储过程才能重新编译。编译存储过程基本上意味着存储过程的执行计划被缓存。无论您使用sp_recompile还是创建存储过程WITH RECOMPILE,您只需告诉SQL需要重新缓存执行计划。该sp_recompile仅删除现有的执行计划。

  

sp_recompile系统存储过程强制重新编译a   下次运行时存储过程。它通过这样做   从过程高速缓存中删除现有计划,强制执行新计划   在下次运行程序时创建。

更多信息:https://msdn.microsoft.com/en-us/library/ms190439(v=sql.110).aspx