Today I run this
select 'exec sp_refreshview N''['+table_schema+'].['+table_name+']'''
from information_schema.tables
where table_type = 'view'
This generates a lot of: exec sp_refreshview N'[SCHEMA].[TABLE]'. I then copy the result to the query editor window and run all those execs.
How do I do this all at once?
I would like to have a stored procedure called something like dev.RefreshAllViews which I can execute to do this...
DECLARE @RefreshScript varchar(max)
set @RefreshScript = ''
select @RefreshScript= @RefreshScript + 'exec sp_refreshview N''['+table_schema+'].['+table_name+']''
'
from information_schema.tables
where table_type = 'view'
exec (@RefreshScript)
If there is ever any danger of your views having the [] characters in their names you might want to look at the QUOTENAME function.
Or Also with a cursor
DECLARE @viewName AS VARCHAR(255)
DECLARE listOfViews CURSOR
FOR SELECT '[' + SCHEMA_NAME(uid) + '].[' + name + ']'
FROM sysobjects
WHERE xtype = 'V'
OPEN listOfViews
FETCH NEXT FROM listOfViews INTO @viewName
WHILE ( @@FETCH_STATUS <> -1 )
BEGIN
FETCH NEXT FROM listOfViews INTO @viewName
BEGIN TRY
EXEC sp_refreshview @viewName
PRINT @viewName + ' refreshed OK'
END TRY
BEGIN CATCH
PRINT @viewName + ' refresh failed'
END CATCH
END
CLOSE listOfViews
DEALLOCATE listOfViews
Check the system procedure SP_ExecuteSQL
, which accepts a string and executes it.
You could write a stored procedure that opens a cursor on the query above, generates the proper strings, and executes them.
DECLARE @Sql VARCHAR(MAX) = ''
SELECT @Sql += 'EXEC sys.sp_refreshview @viewname = N''' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + '''' + CHAR(10)
FROM INFORMATION_SCHEMA.VIEWS
PRINT @Sql
EXEC(@Sql)