sql-server - 更新 View 不​​起作用

标签 sql-server database tsql sql-view

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

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

我知道这是因为我在 select 语句中有一个常量,但有没有办法绕过它?请帮忙

这是我的 View 代码

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'

谢谢

最佳答案

您不能更新作为计算结果的列。

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

  • 任何修改,包括 UPDATE、INSERT 和 DELETE 语句,都必须仅引用一个基表中的列。
  • 在 View 中修改的列必须直接引用表列中的基础数据。这些列不能以任何其他方式派生,例如通过以下方式:
    • 聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
    • 计算。不能从使用其他列的表达式计算该列。使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列构成计算,也不可更新。
  • 被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。
  • TOP 没有在 View 的 select_statement 中与 WITH CHECK OPTION 子句一起使用。

这里不仅您的 View 使用了 UNION 语句,而且您尝试更新的 AutoProcess 字段实际上是 CASE 的结果使用两个字段的语句。尝试更新它是没有意义的。

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

关于sql-server - 更新 View 不​​起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22990467/

相关文章:

sql-server - 列出当前发布用于复制 MS-SQL 的所有表

c# - ServiceController.Stop() 后服务未完全停止

sql-server - SQL : Recursive search for each row

sql-server-2005 - 索引性能 BigInt 与 VarChar

c# - 如何使用 C# 通过 html 表单将数据库值与输入进行比较

sql-server - Hibernate 与 MS SQL Server 2012 的表锁和并行查询问题

sql - 包含多个连接的 SQL 语句如何工作?

php - 像 drupal_write_record 一样简单的读取操作

php - 如何使用php根据mysql表中的数据自动创建div?

sql-server - SQL 查询中 SELECT 语句中的WITH TIES 关键字有什么用?