【问题标题】:SQL Server view - derived date columnSQL Server 视图 - 派生日期列
【发布时间】:2013-12-17 20:04:21
【问题描述】:

我使用Employee 表中的 2 列创建了一个视图,如下所示

Create VIEW [dbo].[vwTestEmp] AS 
   select 
       EMpID,
       case when (Address1 IS null) then null
            when (Address1 IS not null) then Address1
       end as "EMpAddress",
       '' as "Date_Verified" 
   FROM Employee;

现在Date_Verified 不在Employee 表中,视图中的派生列也是如此,并且包含空值。手动验证某些流程后,我想调用

update [dbo].[vwTestEmp] 
set Date_verified = GETDATE() 
where EMpid = 60;

我收到一个错误

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

如何处理这个错误?

谢谢 先生

【问题讨论】:

  • 您知道非索引视图实际上并不存储数据,对吧?那么您的更新声明实际上要做什么?
  • 这个日期可能会在更新完成时进行调查,表格中的任何差异,我们都可以使用该日期来查找。
  • 我认为您不太了解视图是什么。 它不存储数据。

标签: sql-server view


【解决方案1】:

您无法通过 Date_Verified 的常量值更新视图。将查询更改为:

CREATE VIEW [dbo].[vwTestEmp1] AS 
    SELECT EMpID, Address1 AS EMpAddress], [Date_Verified] 
        FROM EMployee;

这避免了不必要的 CASE 并将日期列的常量值替换为基础列。

此更新如SqlFiddle 所示。

【讨论】:

  • Date_Verified is not in EMployee table
  • 正确,但如果要更新,则需要在某个表中。如果不是,那么整个问题就没有实际意义了。在这种情况下,我很乐意删除我的答案。
  • 这就是我在上面添加评论的原因。
  • @Pekka,Date_Verified 不在 Employee 表中的任何其他表中
  • 如果是这样,那么使用 UPDATE 的全部意义就没有了。它必须在某个基础表中有一个列才能工作。如果这不是正确答案,您将需要扩展您的问题以使答案正确。
【解决方案2】:

你有一个错误。正确的语法是:

UPDATE < view_name > SET<column1>=<value1>,<column2>=<value2>,... WHERE <condition>;

【讨论】:

  • 那我不知道。也许这个link可以帮助你。
【解决方案3】:

使用表格。

select 
    EMpID,
    Address1 as "EMpAddress",
    '' as "Date_Verified"
INTO [dbo].[tblTestEmp]
FROM Employee;

update [dbo].[tblTestEmp] 
set Date_verified = GETDATE() 
where EMpid = 60;

【讨论】:

  • 谢谢!!我就是这么做的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2016-01-09
  • 2014-08-02
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多