我正在使用MS SQL Server,并且想通过执行“ Alter View ViewName为([一些SQL])之类的内容,我想从存储过程中更改视图。

Google抛出的几页声称,这不受直接支持(也不是相关的更改陈述),但是也有一些示例说明如何使用这样的构造来解决它:

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

编写代码,因为字面字符串闻起来有些闻到,即使对于SQL也是如此。

我的问题:

  1. 为什么不支持这?从Sproc运行它并作为独立语句运行它有什么区别?
  2. 为什么解决方法通过 exec字面的SQL字符串工作?我对 exec 声明是否仅在线执行SQL,这是不正确的吗?
  3. (不乐观)是否有更好的方法可以在存储过程中从视图中进行更改?
有帮助吗?

解决方案

我认为答案是:

  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

- 然后在您想要的,erm,摆动表格时在过程中截断swing_table-由于截断不是交易命令,因此应立即执行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top