6

我正在使用 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)

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

我的问题:

  1. 为什么不支持这个?从 sproc 运行它和作为独立语句运行它有什么区别?
  2. 为什么通过execing 文字 SQL 字符串的解决方法有效?我对exec语句的理解是,它只是内联执行 SQL,这是不正确的吗?
  3. (不乐观)有没有更好的方法来从存储过程中更改视图?
4

1 回答 1

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

- 然后在过程中 TRUNCATE swing_table 当你想,呃,摆动表 - 因为 TRUNCATE 不是一个事务性命令,它应该立即执行。

于 2010-09-16T16:45:08.177 回答