为什么SQL Server不能更改存储过程中的视图?

为什么SQL Server不能更改存储过程中的视图?,sql,sql-server,stored-procedures,alter-table,sql-view,Sql,Sql Server,Stored Procedures,Alter Table,Sql View,我使用的是MS SQL Server,我希望通过执行类似alter view VIEWNAME as[某些SQL]的操作,从存储过程中更改视图 google抛出的一些页面断言这不受直接支持,相关的alter table语句也不受支持,但也有一些示例说明如何使用如下构造来解决这一问题: declare @sql varchar(max) select @sql = 'alter view VIEWNAME as ([some sql])' exec(@sql) 以文本字符串形式编写代码有点难闻,

我使用的是MS SQL Server,我希望通过执行类似alter view VIEWNAME as[某些SQL]的操作,从存储过程中更改视图

google抛出的一些页面断言这不受直接支持,相关的alter table语句也不受支持,但也有一些示例说明如何使用如下构造来解决这一问题:

declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)
以文本字符串形式编写代码有点难闻,即使对于SQL也是如此

我的问题是:

为什么不支持这一点?从存储过程运行此语句和将其作为独立语句运行有什么区别? 为什么通过执行文本SQL字符串来解决问题?我对exec语句的理解是,它只是在线执行SQL,这是错误的吗? 不乐观从存储过程中更改视图还有更好的方法吗?
我认为答案是:

MS希望防止DDL在过程内运行。 exec语句中的代码不被视为过程的一部分,因此它不受与过程相同的限制。 不 另一种方法可能是使用一个名为swing_table的单独表,其中包含1或0条记录,以指示视图是否应查询生产或其他备份?表-类似于:

create view viewname as
select {field list}
from production_table
cross join swing_table
union all
select {field list}
from backup_table
where (select count(*) from swing_table) = 0

-然后,当您希望(呃)摆动表时,在过程中截断swing_表-因为TRUNCATE不是事务性命令,它应该立即执行。

ALTER VIEW必须是批处理中的唯一语句。我想这只是为了便于解析。当您运行EXEC时,它将作为一个不同的批处理运行。对于一个假定为企业级的数据库套件来说,解析的简单性似乎有点让人望而却步!:除非有什么原因,否则无法解析?似乎不太可能。为什么要更改SP中的视图?例如,我们不希望为执行此操作的进程授予任意模式更新权限,而不是将处理分为几个阶段或具有多个视图。这里的视图用作指向两个备份表的间接层,我们更新另一个备份表,然后在完成后摆动视图。整个过程都是事务性的。@jjk:但是,既然可以通过查询实现同样的功能,为什么还要使用视图呢?另外,当您说您要打开视图时,您的意思是从中选择吗?