【问题标题】:Add constant updatable column for a view in SQL Server为 SQL Server 中的视图添加常量可更新列
【发布时间】:2015-05-18 05:56:52
【问题描述】:

我有这样的看法:

Create View View1 
AS 
Select F1,F2,0 As F3
From TB1

GO 

Update View1 Set F3=1

这些命令会引发此错误:

视图或函数“view1”的更新或插入失败,因为它包含派生或常量字段。

有没有更新“F3”字段的解决方案?

谢谢

【问题讨论】:

  • 您需要将该列添加到表中。
  • 其实我没有权限向被引用的表中添加列。
  • 为什么要更新视图?我认为您必须改变自己的方式并创建新视图或以其他方式使用该视图;)。
  • 通过视图进行更新是完全合法的,但您不是在更新视图,而是在更新基础表。
  • @ZohrehTavakoli:我在下面更新了我的答案,包括一个允许您直接在视图上更新的解决方案,但您需要一个额外的表来存储 F3 列的值。

标签: sql-server


【解决方案1】:

更改视图中常量列的值的唯一方法是更改​​视图本身。对视图的常量或计算列运行 UPDATE 语句没有意义,因为该值并未物理存储在任何表中。因此,您必须执行以下操作:

ALTER VIEW View1 A
Select F1,F2,1 As F3
From TB1

现在,您可能很想将此代码放入存储过程中。不幸的是,这也是不可能的,因为DDL statements are not allowed in Stored Procedures。因此,另一种解决方案是将 F3 列的值存储在单独的表中,并更改视图定义以将值带入视图:

CREATE TABLE F3Column (
    Value AS int
)

go

INSERT F3Column VALUES (0)

go

CREATE VIEW View1 AS
select F1, F2, Value AS F3
from TB1, F3Column

go

-- This will allow you to change the value directly on the view:
UPDATE View1 SET F3 = 1

只需确保您的 F3Column 表始终包含 1 条记录。如果它不包含任何记录,View1 将始终为空。如果它包含超过 1 条记录,View1 会给你重复。

【讨论】:

    【解决方案2】:

    F3 不是任何表中的列,这就是您无法更新值的原因。您需要将其添加到表中,或者在某些情况下使用 CASE 将其显示为新值

    CASE WHEN [condition goes here] THEN 1 END
    

    【讨论】:

    • 实际上我需要在视图上创建一个新的物理列。有可能吗?
    • 不,这样的列必须存在于表中。
    • @LasseV.Karlsen 提到你不能。但是你为什么要更新一个不存在的列呢?正如我在回答中所说,您可以在某些条件下将其显示为另一个值
    【解决方案3】:

    我认为您希望在结果中将1 显示为F3,如下所示:

    SELECT F1, F2, 1 As F3
    FROM View1
    

    或者像这样创建一个新视图:

    Create View View2 
    AS 
    Select F1, F2, 1 As F3
    From TB1    
    GO 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      相关资源
      最近更新 更多