Как создать хранимую процедуру, которая вызывает sp_refreshview для каждого представления в базе данных? - PullRequest
2 голосов
/ 22 марта 2010

Сегодня я запускаю это

select 'exec sp_refreshview N''['+table_schema+'].['+table_name+']'''
from information_schema.tables
where table_type = 'view'

Это создает много: exec sp_refreshview N '[SCHEMA]. [TABLE]'. Затем я копирую результат в окно редактора запросов и запускаю все эти execs.

Как мне сделать все это одновременно? Я хотел бы иметь хранимую процедуру под названием что-то вроде dev.RefreshAllViews, который я могу выполнить, чтобы сделать это ...

Ответы [ 3 ]

10 голосов
/ 22 марта 2010
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)

Если когда-либо существует опасность того, что в ваших представлениях есть символы [] в именах, вы можете посмотреть на функцию QUOTENAME.

Или также с помощью курсора

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
0 голосов
/ 06 февраля 2017
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)
0 голосов
/ 22 марта 2010

Проверьте системную процедуру SP_ExecuteSQL, которая принимает строку и выполняет ее.

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

...