如何在SQL Server 2008中重建视图

Jim*_*eth 27 sql t-sql sql-server view sql-server-2008

在我的数据库中有一个视图,有人用一个表定义*.我刚刚在该表中添加了一个新列,我希望该视图能够反映新列.除了重新执行视图创建脚本之外,还有另一种重建视图的方法吗?我正在寻找类似于sp_recompile将如何重新编译存储过程(或更准确地标记它将在下次调用时编译)的内容.

更新:在远景中我尝试在视图上调用sp_recompile,并且在调用工作时,它没有重建视图.

更新2:我希望能够从脚本中执行此操作.因此,将列添加到表中的脚本也可以更新视图.就像我说的那样,类似于sp_recompile.

Cor*_*ory 40

我相信你所寻找的是

sp_refreshview [ @viewname = ] 'viewname'
Run Code Online (Sandbox Code Playgroud)

更新指定的非架构绑定视图的元数据.由于视图所依赖的基础对象的更改,视图的持久元数据可能会过时.

http://technet.microsoft.com/en-us/library/ms187821.aspx


Uwe*_*eim 13

为了重建SQL Server数据库的所有视图,您可以使用以下脚本:

DECLARE @view_name AS NVARCHAR(500);

DECLARE views_cursor CURSOR FOR 
    SELECT TABLE_SCHEMA + '.' +TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'VIEW' 
    AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'IsMsShipped') = 0 
    ORDER BY TABLE_SCHEMA,TABLE_NAME 

OPEN views_cursor 

FETCH NEXT FROM views_cursor 
INTO @view_name 

WHILE (@@FETCH_STATUS <> -1) 
BEGIN
    BEGIN TRY
        EXEC sp_refreshview @view_name;
        PRINT @view_name;
    END TRY
    BEGIN CATCH
        PRINT 'Error during refreshing view "' + @view_name + '".';
    END CATCH;

    FETCH NEXT FROM views_cursor 
    INTO @view_name 
END 

CLOSE views_cursor; 
DEALLOCATE views_cursor;
Run Code Online (Sandbox Code Playgroud)

这是此博客文章的略微修改版本.它也使用sp_refreshview存储过程.


gbn*_*gbn 5

除了Cory的答案,您还可以使用schemabinding和完整的列列表正确定义它.

CREATE VIEW MyView
WITH SCHEMABINDING
AS
SELECT
    col1, col2, col3, ..., coln
FROM
    MyTable
GO
Run Code Online (Sandbox Code Playgroud)