После того как я внес изменения в таблицу, например переименование столбца, я должен изменить все хранимые процедуры, функции и представления, которые ссылаются на столбец таблицы. Очевидно, я должен вручную изменить их один за другим. Но моя база данных содержит сотни подобных объектов. Поэтому я хотел убедиться, что я изменил все зависимые объекты. Одним из решений является перекомпиляция всех объектов (через скрипт). Но перекомпиляция происходит только при следующем выполнении каждого объекта. Но я хочу проверить их и получить детали сейчас.
Для этого я могу использовать « sp_refreshsqlmodule » вместо « sp_recompile ». Это обновит каждый объект и выдаст сообщение об ошибке, если он не анализируется правильно.
Вот скрипт ниже;
-- table variable to store procedure names
DECLARE @tblObjects TABLE (ObjectID INT IDENTITY(1,1), ObjectName
sysname)
-- get the list of stored procedures, functions and views
INSERT INTO @tblObjects(ObjectName)
SELECT '[' + sc.[name] + '].[' + obj.name + ']'
FROM sys.objects obj
INNER JOIN sys.schemas sc ON sc.schema_id = obj.schema_id
WHERE obj.[type] IN ('P', 'FN', 'V') -- procedures, functions, views
-- counter variables
DECLARE @Count INT, @Total INT
SELECT @Count = 1
SELECT @Total = COUNT(*) FROM @tblObjects
DECLARE @ObjectName sysname
-- start the loop
WHILE @Count <= @Total BEGIN
SELECT @ObjectName = ObjectName
FROM @tblObjects
WHERE ObjectID = @Count
PRINT 'Refreshing... ' + @ObjectName
BEGIN TRY
-- refresh the stored procedure
EXEC sp_refreshsqlmodule @ObjectName
END TRY
BEGIN CATCH
PRINT 'Validation failed for : ' + @ObjectName + ', Error:' +
ERROR_MESSAGE() + CHAR(13)
END CATCH
SET @Count = @Count + 1
END
Если какой-либо объект выдает ошибку, я могу теперь обратиться к нему и вручную исправить проблему с ним.