为什么SQL Server不能在存储过程中更改视图?
-
02-10-2019 - |
题
我正在使用MS SQL Server,并且想通过执行“ Alter View ViewName为([一些SQL])之类的内容,我想从存储过程中更改视图。
Google抛出的几页声称,这不受直接支持(也不是相关的更改陈述),但是也有一些示例说明如何使用这样的构造来解决它:
declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)
编写代码,因为字面字符串闻起来有些闻到,即使对于SQL也是如此。
我的问题:
- 为什么不支持这?从Sproc运行它并作为独立语句运行它有什么区别?
- 为什么解决方法通过
exec
字面的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
- 然后在您想要的,erm,摆动表格时在过程中截断swing_table-由于截断不是交易命令,因此应立即执行。
不隶属于 StackOverflow