如何使用Alter在SQL-Server 2014中为现有视图添加新列

27

我创建了一个基于另一个视图和表的视图。我想添加一个新的类型为varchar的列。我尝试了以下方法,但是出现语法错误?由于我是SQL的新手,所以无法理解。

ALTER VIEW [dbo].[MyView]
ADD New_Col varchar(10) null 
GO

什么是错误信息?帮助我们帮助您。 - Shiva
1
不确定您所说的基于另一个视图创建视图的含义,但如果您的视图是嵌套的,则会出现性能问题。嵌套视图似乎很合理,但实际上它们非常糟糕。https://www.simple-talk.com/sql/performance/the-seven-sins-against-tsql-performance/ - Sean Lange
4个回答

31

你需要重新编写整个视图,只添加或省略你要更改的内容。

例如,现在你的视图是:

create view myView as
  select field1
  from table1

如果你现在想要添加一个名为 New_Col 的字段,那么你需要编写如下代码:

alter view myView as
  select field1,
         New_Col
  from table1

我们不能为数据库中的所有视图编写一个添加列的脚本吗? - manikanta nvsr
@manikantanvsr 是的,你可以使用 select * 或者 select table_name.*。但是请记住,视图不会自动从表中获取新列。在你修改表之后,你需要使用 SP_REFRESHVIEW "view_name" 刷新视图。 - Aditya Kar
@AdityaKar 我绝对不会向任何人推荐使用 select *,这只是一种糟糕的做法。尤其是在视图中更是如此! - GuidoG

3

您无法像更改表格一样更改视图。您需要将视图脚本为Alter,然后更改生成视图的select语句。


0

你不能使用 ALTER VIEW 语句更改视图的 SELECT 语句。 相反,你必须删除并重新创建该视图。


1
不需要删除视图,您可以使用alter view,但不像表格那样。请参考我的答案。 - GuidoG

-1
if not exists(select * from sys.columns where (name='columnToBeAdd') and object_id=object_id('YourViewName'))
begin
Declare @ViewDefinition varchar(max) 
select @ViewDefinition=definition from sys.objects o join sys.sql_modules m on m.object_id=o.object_id
where o.object_id=object_id('YourViewName') 
and o.type ='V'
select 
@ViewDefinition=REPLACE( replace(@ViewDefinition,'CREATE ','Alter '),' Create ' ,' Alter ' ) 
Select @ViewDefinition=REPLACE( @ViewDefinition, 'From ',', YourTableName.columnToBeAdd + CHAR(13) +  ' From ' )

exec( @ViewDefinition)
end

你能使用内置的格式化工具使其更易读吗? - Anton Krug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接