![](/img/trans.png)
[英]sp_refreshView replaces view implementation when sp_rename has occured
[英]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.