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

Joe*_*ney 5 sql sql-server stored-procedures alter-table sql-view

我正在使用MS SQL Server,我想通过执行"alter view VIEWNAME as([some sql])"之类的操作来改变存储过程中的视图.

谷歌提出的一些页面声称这不是直接支持的(并且都不是相关的alter-table语句),但也有一些例子说明如何使用这样的结构来解决它:

declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)
Run Code Online (Sandbox Code Playgroud)

将代码编写为文字字符串有点味道,即使对于SQL也是如此.

我的问题:

  1. 为什么不支持?从sproc运行它并将其作为独立语句运行之间的区别是什么?
  2. 为什么通过exec文字SQL字符串的解决方法有效?我的理解exec语句的是它只是在线执行SQL,这是不正确的?
  3. (不乐观)有没有更好的方法从存储过程中更改视图?

小智 2

我认为答案是:

  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
Run Code Online (Sandbox Code Playgroud)

- 然后,当您想要,呃,摆动表时,在过程中 TRUNCATE swing_table - 因为 TRUNCATE 不是事务命令,所以它应该立即执行。