簡體   English   中英

如何為數據庫中的每個視圖創建調用sp_refreshview的存儲過程?

[英]How do I create a stored procedure that calls sp_refreshview for each view in the database?

今天我跑了

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

這會產生很多:exec sp_refreshview N'[SCHEMA]。[TABLE]'。 然后我將結果復制到查詢編輯器窗口並運行所有這些exec。

我如何一次完成這一切? 我想有一個名為dev.RefreshAllViews的存儲過程,我可以執行它來執行此操作...

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

檢查系統過程SP_ExecuteSQL ,它接受一個字符串並執行它。

您可以編寫一個存儲過程,在上面的查詢中打開游標,生成正確的字符串並執行它們。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM