在 SQL Server 中,表添加一列。导致视图错误

Posted

技术标签:

【中文标题】在 SQL Server 中,表添加一列。导致视图错误【英文标题】:In SQL Server, table add a column. causing view error 【发布时间】:2013-05-06 01:41:25 【问题描述】:

在 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

【问题讨论】:

您可以尝试在视图定义中搜索已更改的表,***.com/questions/4765323/is-there-a-way-to-retrieve-the-view-definition-from -a-sql-server-using-plain-ado Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已随 ANSI-92 SQL 标准(超过 20 年前!) 谢谢!好习惯:select a.*,b.Price from tblTestA a inner join tblTestB b on a.Part=b.Part ? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

根据您的提示,我找到了所有视图。然后什么 ?一一手动执行查看脚本? @dream - 正如其他答案中所建议的那样,您可以拥有一个更新视图的脚本。【参考方案3】:

我们遇到了同样的问题 - 我们的解决方案必须提供一个 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

【讨论】:

以上是关于在 SQL Server 中,表添加一列。导致视图错误的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver语句添加列(简单)

sql 语句 在查询的结果中在添加一列类型

SQL语句如何增加列?

sql语句怎么把列变成行

怎么使用sql语句添加列?

如何有条件的更新sql 数据表中的列值?