2016-11-08 69 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