如何为数据库中的每个视图创建调用sp_refreshview的存储过程?

时间:2010-03-22 10:12:05

标签: sql-server stored-procedures cursor

今天我运行这个

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

这会产生很多:exec sp_refreshview N'[SCHEMA]。[TABLE]'。然后我将结果复制到查询编辑器窗口并运行所有这些执行程序。

如何一次完成所有操作? 我想有一个名为dev.RefreshAllViews的存储过程,我可以执行它来执行此操作...

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:0)

检查系统过程SP_ExecuteSQL,它接受​​一个字符串并执行它。

您可以编写一个存储过程,在上面的查询中打开游标,生成正确的字符串,然后执行它们。

答案 2 :(得分:0)

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)