在 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 中,表添加一列。导致视图错误的主要内容,如果未能解决你的问题,请参考以下文章