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存储过程.
除了Cory的答案,您还可以使用schemabinding和完整的列列表正确定义它.
CREATE VIEW MyView
WITH SCHEMABINDING
AS
SELECT
col1, col2, col3, ..., coln
FROM
MyTable
GO
Run Code Online (Sandbox Code Playgroud)