2015-10-29 3 views
1

С помощью следующего сценария я попытался перекомпилировать все наши хранимые процедуры в базе данных, потому что мы обновляемся до SQL Server 2012 (с 2005 года), и я хочу заранее убедиться, что они не сломать.SQL Server перекомпилировал отмеченные хранимые процедуры

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

Это то, что процедура sp_recompile делает. Вот страница документации. https://msdn.microsoft.com/en-us/library/ms181647.aspx Вот самое первое предложение ... «Вызывает повторную компиляцию хранимых процедур, триггеров и пользовательских функций при следующем запуске «. –

+3

Поскольку вы обновляетесь с 2005 по 2012 год, это упражнение бессмысленно. Планы выполнения должны будут кэшироваться в 2012 году, поэтому все будет перекомпилировано в любом случае. Спасите себя от хлопот. Сделайте свое обновление. Обновлять статистику, восстанавливать индексы и т. Д. Кэш плана выполнения будет сначала немного вялым, но он «кэшируется» довольно быстро. –

ответ

1

Вы должны выполнить хранимую процедуру для того, чтобы перекомпилировать. Для компиляции хранимой процедуры в основном означает, что план выполнения для хранимой процедуры proc будет кэшироваться. Используете ли вы sp_recompile или создаете хранимую процедуру WITH RECOMPILE, вы просто говорите SQL, что план выполнения должен быть повторно кэширован. Это sp_recompile удаляет только существующий план выполнения.

Хранимая процедура системы sp_recompile вынуждает перекомпилировать хранимую процедуру в следующий раз, когда она будет запущена. Он делает это , удаляя существующий план из кэша процедур, заставляя новый план быть создан в следующий раз, когда будет запущена процедура.

Дополнительная информация: https://msdn.microsoft.com/en-us/library/ms190439(v=sql.110).aspx

Смежные вопросы