【问题标题】:Why can't SQL Server alter a view in a stored procedure?为什么 SQL Server 不能更改存储过程中的视图?
【发布时间】:2011-04-12 14:33:12
【问题描述】:

我正在使用 MS SQL Server,我想通过执行类似“alter view VIEWNAME as ([some sql])”之类的方法来更改存储过程中的视图。

google 抛出的几页断言不直接支持这一点(相关的 alter-table 语句也不支持),但也有一些示例说明如何使用这样的结构来解决它:

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

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

我的问题:

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

【问题讨论】:

  • ALTER VIEW 必须是批处理中的唯一语句。我想这只是为了便于解析。当您运行 EXEC 时,它会作为不同的批次运行。
  • “易于解析”对于一个所谓的企业级数据库套件来说似乎有点过分了! :) 除非有某种原因无法解析?似乎不太可能..
  • 为什么要更改 SP 中的视图? (而不是将您的处理分成几个阶段或拥有多个视图)
  • 我们不想将任意模式更新权限授予执行此操作的进程。这里的视图用作指向两个后备表的间接层,我们更新“其他”一个,然后在完成时摆动视图。整个事情都是事务性的。
  • @jjk:但是当您可以通过查询实现相同的目标时,为什么还要使用视图呢?另外,当您说“摆动”视图时,您的意思是您从中进行选择吗?

标签: sql sql-server stored-procedures alter-table sql-view


【解决方案1】:

我认为答案是:

  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 当您想要,erm,摆动表时 - 因为 TRUNCATE 不是事务性命令,它应该立即执行。

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 2010-12-08
    • 2015-10-28
    • 2020-12-19
    • 2011-02-23
    • 2014-01-12
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多