2013-12-17 41 views
0

我創建使用2列的視圖從我Employee表這樣SQL Server視圖 - 衍生日期列

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」插入失敗。

如何處理這個錯誤?

感謝 MR

+1

你知道一個非索引視圖並不實際存儲數據嗎?那麼你的更新聲明實際上會做什麼? –

+0

這個日期可能會在更新完成和表中的任何差異時被查看,我們可以找出使用日期。 – user2726975

+0

我不認爲你很理解什麼是觀點。 **它不存儲數據。** –

回答

0

你有一個錯誤。正確的語法是:

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

對不起,這是一個錯字..我編輯了它 – user2726975

+0

然後我不知道。也許這[鏈接](http://www.sqlservercentral.com/blogs/sqldbauk/2011/08/03/updating-views/)可以幫助你。 – Sergi

2

您無法通過Date_Verified的常量值更新視圖。將查詢更改爲:

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

這可以避免不必要的CASE,並將日期列的常量值替換爲基礎列。

此更新如SqlFiddle中所示。

+0

** Date_Verified不在EMployee表中** –

+0

正確,但是如果它是可更新的,它需要在某個表中。如果不是,整個問題都是沒有意義的。在這種情況下,我會很樂意刪除我的答案。 – Pekka

+0

這就是爲什麼我在上面添加了我的評論。 –

0

使用表格。

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

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

謝謝!這就是我所做的 – user2726975