为什么SQL Server无法在存储过程中更改视图?

问题描述

我认为答案是:

  1. MS希望防止在过程中运行DDL。
  2. 代码 的exec语句不被视为过程的一部分-所以它不会受到同样的限制程序。
  3. 不。

一种替代方法是使用一个单独的表(称为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

-然后,在程序中执行TruncATE swing_table时,erm,摆动表-由于TruncATE不是事务性命令,因此应立即执行。

解决方法

我正在使用MS SQL Server,并且想通过执行“将viewname更改为([somesql])”之类的东西来更改存储过程中的视图。

google抛出的一些页面断言,它不直接受支持(也没有相关的alter-table语句),但是也有一些示例,说明了如何使用如下构造方法来解决此问题:

declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)

以文字字符串形式编写代码有一点气味,即使对于SQL来说也是如此。

我的问题:

  1. 为什么不支持此功能?从sproc运行此代码并将其作为独立语句运行有什么区别?
  2. 为什么通过exec文字SQL字符串解决问题的方法起作用?我对该exec语句的理解是,它仅以内联方式执行SQL,这是不正确的吗?
  3. (不乐观)是否有更好的方法从存储过程中对视图进行更改?