更新视图不​​起作用

时间:2014-04-10 14:08:43

标签: sql-server database tsql sql-view

我正在处理一个视图,然后由用户更新。此更新基本上更改了列的值。但是现在它不允许我这样做并产生这个:

Update or insert of view or function '' failed because it contains a derived or constant field.

我知道这是因为我在select语句中有一个常量但是有办法解决它吗?请帮忙

这是我的视图代码

Create view Schema.View1
as
SELECT
Convert(Varchar(20),l.jtpName) as JobType, Convert(Varchar(10),' <All> ')as SubCategory , Convert(varchar (3), Case when a.jtpName= l.jtpName and a.subName= ' <All> ' then 'Yes' else 'No' end) As AutoProcess from Schema.JobType l left join Schema.Table1 a on l.jtpName=a.jtpName
UNION
SELECT
Convert(Varchar(20),a.jtpName) as JobType, Convert(Varchar(10),a.subName) as SubCategory, Convert(varchar (3),Case when b.jtpName= a.jtpName and b.subName= a.subName then 'Yes' else 'No' end) As AutoProcess from Schema.SubCategory a left join fds.Table1 b on a.subName=b.subName

GO

最后更新声明:

UPDATE Schema.View1 SET AUTOPROCESS = Case WHEN AUTOPROCESS = 'Yes' Then 'No' END Where JOBTYPE = 'Transport' and SUBCATEGORY= 'Cargo'

谢谢

3 个答案:

答案 0 :(得分:4)

您无法更新作为计算结果的列。

根据MSDN,视图列可更新的条件之一是:

  • 任何修改(包括UPDATE,INSERT和DELETE语句)都必须仅引用一个基表中的列。
  • 视图中要修改的列必须直接引用表列中的基础数据。无法以任何其他方式派生列,例如通过以下方式:
    • 聚合函数:AVG,COUNT,SUM,MIN,MAX,GROUPING,STDEV,STDEVP,VAR和VARP。
    • 计算。无法从使用其他列的表达式计算列。通过使用集合运算符 UNION ,UNION ALL,CROSSJOIN,EXCEPT和INTERSECT形成的列相当于计算并且也不可更新。
  • 正在修改的列不受GROUP BY,HAVING或DISTINCT子句的影响。
  • TOP不会在视图的select_statement中的任何位置与WITH CHECK OPTION子句一起使用。

此处,您的视图不仅使用UNION语句,而您尝试更新的AutoProcess字段实际上是使用两个字段的CASE语句的结果。尝试更新它是没有意义的。

我建议您使用存储过程执行写入操作。或者,正如Damien建议的那样,您也可以在视图上使用INSTEAD OF触发器。

答案 1 :(得分:2)

您必须创建TRIGGER并自行将inserteddeleted伪表中的更改应用于基表。

答案 2 :(得分:0)

sql server无法从转换函数向后工作到原始字段。您无法以这种方式更新视图。

如果视图包含您的jptName和subName字段,您可能只能更新这些字段。