2016-11-08 116 views
0

我對SQL還比較陌生。我以前創建了一個視圖,我試圖刪除該視圖。視圖名爲Sales,db是'dbo'。我不斷收到此錯誤:刪除SQL Server視圖

消息4405,級別16,狀態1,行1
視圖或函數「dbo.Sales」不可更新,因爲修改會影響多個基表。

我的代碼是這樣的:

DELETE FROM [dbo].[Sales] 
WHERE SOHNUM_0 IN ('SO004025', 'SO000942', 'SO003772', 'SO005501', 'SO005523') 
GO 

該視圖包含SOHNUM(銷售訂單號)和SOHDAT(訂單日期)。該版本是SQL Server 2012的

select語句是:

Select * from [dbo].[Sales]; 

和結果集爲:

SOHNUM  SOHDAT 
---------------------------------------- 
SO004025 2030-07-25 00:00:00.000 
SO000942 2018-12-17 00:00:00.000 
SO003772 2017-01-10 00:00:00.000 
SO005501 2017-01-03 00:00:00.000 
SO005523 2017-01-03 00:00:00.000 
SO005523 2017-01-03 00:00:00.000 
SO005523 2017-01-03 00:00:00.000 
SO005523 2017-01-03 00:00:00.000 
SO005523 2017-01-03 00:00:00.000 
SO005523 2017-01-03 00:00:00.000 
+0

什麼是視圖的定義...不是從它讀取數據的選擇語句。 –

+0

等等,你想從視圖中刪除數據,或刪除視圖,或從視圖的輸出中刪除一些數據?如果最後一個'select * from dbo.sales where sohnum_0 in'('SO004025','SO000942','SO003772','SO005501','SO005523')'會排除reocrds,drop view dbo.sales會刪除視圖。如果你想從視圖中刪除特殊記錄....那麼你不能從源表中刪除。 (除非視圖基於1並且只有1個表) – xQbert

+1

建議:(1)不要從視圖中刪除。 (2)名稱視圖將它們與基表區分開來。 –

回答

4

這將有助於看到SELECT聲明,定義視圖,但我認爲這個錯誤很明顯:你不能從這個視圖中刪除,因爲這個視圖從多個表中讀取數據。您可以使用INSTEAD OF觸發器來處理針對此視圖的刪除操作,但不知道數據庫及其預期用途,很難就如何最好地處理此問題提供建議。

祝你好運。

+1

謝謝我更新,包括選擇視圖。 –

+0

dbo.Sales是如何定義的? –

0

很少有意見符合所有允許您直接更新或刪除它們的規則。您的觀點不符合規則。最好的辦法是做你原本應該做的事情,並直接從基表中刪除。

+0

如果看起來可能,你的表是相關的,那麼你首先需要從子表中刪除。當然,從標題爲SALES的東西中刪除通常是一個糟糕的主意。 – HLGEM