问题描述
我认为答案是:
- 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
-然后,在程序中执行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来说也是如此。
我的问题:
- 为什么不支持此功能?从sproc运行此代码并将其作为独立语句运行有什么区别?
- 为什么通过
exec
文字SQL字符串解决问题的方法起作用?我对该exec
语句的理解是,它仅以内联方式执行SQL,这是不正确的吗? - (不乐观)是否有更好的方法从存储过程中对视图进行更改?