当前位置: 首页 > 面试题库 >

为什么SQL Server无法在存储过程中更改视图?

公良育
2023-03-14
问题内容

我正在使用MS SQL Server,并且想通过执行“将viewname更改为([somesql])”之类的东西来更改存储过程中的视图。

google抛出的一些页面断言,它不直接受支持(也没有相关的alter-table语句),但是也有一些示例,说明了如何使用如下构造方法来解决此问题:

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

-然后,在程序中执行TRUNCATE swing_table时,erm,摆动表-由于TRUNCATE不是事务性命令,因此应立即执行。



 类似资料:
  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 问题内容: 我在MySQL数据库中存储了大约一百个例程,其中大多数都以“ root”作为定义者。 我有另一个名为“ abc”的mysql帐户,如何将所有例程的定义程序更改为“ abc”。 如果我只能以“ abc”用户而不是“ root”用户身份访问MySQL服务器,是否可以这样做? 问题答案: 据我所知:您将必须获取所有脚本的脚本文本并将其拖放/重新创建为abc。除非abc有权删除/创建过程,否则

  • 问题内容: 最近,我们的数据库服务器出现问题,经过长时间的努力,决定更换数据库服务器。因此,我们设法将数据库还原到另一台服务器上,更改了连接字符串等。一切都按计划进行,直到我们尝试从Web浏览器访问该网站。 我们开始遇到有关找不到数据库对象的错误。后来我们发现它是由于修改后的架构名称而发生的。由于Kentico数据库中有数百个数据库对象(表,视图和存储过程),因此手动逐个更改所有对象是不可行的。有

  • 问题内容: 我有一个基本查询,只需将一个连接从更改为或“ LEFT LOOP JOIN”即可将其从6秒更改为1秒。谁能解释为什么这会导致性能大幅提高,以及为什么SQL的优化器无法自行解决? SQL大致如下所示: 表A和B在所有ID字段上都有数百万条记录和索引。使用SQL Server 2005。 编辑: 一位同事建议使用LEFT LOOP JOIN,它似乎使它变得更快… SQL并不是我的强项之一,

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息