This script is used to refresh related views when fields are deleted or added, and to check view, function, stored procedure validity.
SQL2005 and below
--View, stored procedure, function name DECLARE @NAME NVARCHAR(255); --local cursor DECLARE @CUR CURSOR SET @CUR=CURSOR SCROLL DYNAMIC FOR SELECT NAME FROM DBO.SYSOBJECTS WHERE NAME NOT IN ('SYSCONSTRAINTS','SYSSEGMENTS') AND ( OBJECTPROPERTY(ID, N'IsView') = 1 -- view OR OBJECTPROPERTY(ID,N'IsProcedure') = 1 -- stored procedure OR OBJECTPROPERTY(ID,N'IsScalarFunction') = 1 --scalar function OR OBJECTPROPERTY(ID,N'IsTableFunction') = 1 -- title function OR OBJECTPROPERTY(ID,N'IsInlineFunction') = 1 -- inline function ); OPEN @CUR; FETCH NEXT FROM @CUR INTO @NAME WHILE (@@FETCH_STATUS=0) BEGIN DECLARE @OldText NVARCHAR(MAX); DECLARE @NewText NVARCHAR(MAX); --Read the creation script, and merge it when the script is too long and divided into multiple records SELECT @OldText=@OldText + CHAR(10) + CHAR(13) + RTRIM(TEXT) FROM SYSCOMMENTS WHERE ID = OBJECT_ID(@NAME); --replace create script with update script SET @NewText=REPLACE(@OldText,N'CREATE VIEW',N'ALTER VIEW'); SET @NewText=REPLACE(@NewText,N'CREATE PROCEDURE',N'ALTER PROCEDURE'); SET @NewText=REPLACE(@NewText,N'CREATE FUNCTION',N'ALTER FUNCTION'); BEGIN TRY EXEC(@NewText); END TRY BEGIN CATCH PRINT N'---------------------------------------------------------------------------'; PRINT @NAME + N' : ' + ERROR_MESSAGE(); --PRINT @OldText; PRINT N'---------------------------------------------------------------------------'; END CATCH FETCH NEXT FROM @CUR INTO @NAME END CLOSE @CUR; DEALLOCATE @CUR;
SQL2008 and above
--View, stored procedure, function name DECLARE @NAME NVARCHAR(255); --local cursor DECLARE @CUR CURSOR SET @CUR=CURSOR SCROLL DYNAMIC FOR SELECT NAME FROM DBO.SYSOBJECTS WHERE NAME NOT IN ('SYSCONSTRAINTS','SYSSEGMENTS') AND ( OBJECTPROPERTY(ID, N'IsView') = 1 -- view OR OBJECTPROPERTY(ID,N'IsProcedure') = 1 -- stored procedure OR OBJECTPROPERTY(ID,N'IsScalarFunction') = 1 --scalar function OR OBJECTPROPERTY(ID,N'IsTableFunction') = 1 -- title function OR OBJECTPROPERTY(ID,N'IsInlineFunction') = 1 -- inline function ); OPEN @CUR; FETCH NEXT FROM @CUR INTO @NAME WHILE (@@FETCH_STATUS=0) BEGIN BEGIN TRY BEGIN TRAN EXEC SP_REFRESHSQLMODULE @NAME; COMMIT END TRY BEGIN CATCH ROLLBACK PRINT N'---------------------------------------------------------------------------'; PRINT @NAME + N' : ' + ERROR_MESSAGE(); --PRINT @OldText; PRINT N'---------------------------------------------------------------------------'; END CATCH FETCH NEXT FROM @CUR INTO @NAME END CLOSE @CUR; DEALLOCATE @CUR;