2

在 SQL Server 中,使用两个表创建一个视图。视图中使用的表*之一。

然后我在表中添加一列。这现在导致视图错误。

必须重建视图来解决这个问题。

如果这张表使用了很多视图,如何识别相关视图并重建它们?

有几种方法?

谢谢!

测试环境:SQL Server 2008

测试 SQL:

 if exists(select * from sys.objects where name='tblTestA' and type='u')
DROP TABLE  tblTestA

create table tblTestA(Part varchar(10),Qty int)
insert into tblTestA values('A',10)
insert into tblTestA values('B',20)
go

if exists(select * from sys.objects where name='tblTestB' and type='u')
    DROP TABLE  tblTestB
GO

create table tblTestB(Part varchar(10),Price decimal(9,4))
GO

insert into tblTestB values('A',1.1)
insert into tblTestB values('B',2.2)
GO

if exists(select * from sys.objects where name='v_test' and type='v')
    DROP VIEW  v_test
go

create View v_test
as
  select a.*,b.Price
  from tblTestA a, tblTestB b 
  where a.Part=b.Part
go

执行:

select * from v_test 
go

结果:

Part Qty Price
A   10  1.1000
B   20  2.2000

添加一列

alter table tblTestA add Remark nvarchar(200) not null default('test')
go

执行:

select * from v_test 
go

结果:

Part Qty Price
A   10  test
B   20  test
4

3 回答 3

4

如果您创建视图WITH SCHEMABINDING,则不会遇到此问题。对于您的视图;-) 您可以使用sp_refreshview

要查找哪些视图依赖于哪些表,您可以使用 GUI,但这并不能很好地扩展。相反,我建议您使用系统管理视图,例如sys.sql_expression_dependencies。这使您可以迭代依赖视图并exec sp_refreshview为每个视图发出问题。

于 2013-05-06T03:22:40.167 回答
2

我们遇到了同样的问题——我们的解决方案必须提供一个 SQL 脚本来刷新所有视图。我们在每批修改数据库结构的更新脚本之后运行此脚本 - 这确保所有视图都是最新的并且正常运行。

这是 T-SQL 代码:

DECLARE @viewname sysname
DECLARE @counter INT

SET @counter = 1

DECLARE viewname_cursor CURSOR FAST_FORWARD FOR
    SELECT v.[name] 
    FROM sys.views v
    INNER JOIN sys.sql_modules m ON v.object_id = m.object_id
    WHERE m.is_schema_bound = 0  -- only refresh non-schemabound views

OPEN viewname_cursor

FETCH NEXT FROM viewname_cursor INTO @viewname

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT CAST(@counter AS varchar(3)) + '. Refreshed view ' + @viewname

    EXEC sp_refreshview @viewname   -- refresh the view in question

    SET @counter = @counter + 1

    FETCH NEXT FROM viewname_cursor INTO @viewname
END

CLOSE viewname_cursor
DEALLOCATE viewname_cursor
GO
于 2013-05-06T04:32:55.737 回答
2

您可以使用 SQL Server Management Studio 找出相关视图。

您需要在 SSMS 中选择表,然后右键单击它。选择View Dependencies

在这张图片中,表格是CompanyCategoryXref(蓝色箭头)。在这种情况下,从属视图是CompanyCategory(红色箭头)。您还可以看到所选项目CompanyCategory是对象类型View(黄色圆圈)。

SSMS 依赖

于 2013-05-06T02:23:39.037 回答