3

我正在使用 SQL Server Management Studio 2008。

我想从一个视图中删除一条记录,该视图显示该记录中所有列的空值。

我不知道,我从哪个表中得到了这个空记录。

我检查了所有为视图连接的表,但没有一个表包含空记录。

谁能帮我从我的视图和所有相关表中删除这条空记录..?

因为我在许多其他页面中使用此视图,它会在每个页面中创建具有空值的错误。

当我尝试从视图中删除此记录时,它显示错误,例如

"Msg 4405, Level 16, State 1, Line 1
View or function 'viewGetProgressOverview' is not updatable because the modification affects multiple base tables."
4

4 回答 4

5

如果您在 SQL 中创建了基于单个表的视图 - 您对视图执行的 DML 操作会自动传播到基表。

但是,当您连接多个表以创建视图时,如果您对视图执行 DML 语句,您将遇到以下错误

Msg 4405, Level 16, State 1, Line 1
View or function 'ViewName' is not updatable because the modification affects
multiple base tables.

更新连接视图的规则如下:

对连接视图的任何 INSERT、UPDATE 或 DELETE 操作一次只能修改一个基础基表。

更新规则

连接视图的所有可更新列都必须映射到保留键的表的列。有关键保留表的讨论,请参见“键保留表”。如果视图是使用 WITH CHECK OPTION 子句定义的,则所有连接列和重复表的所有列都是不可更新的。

删除规则

只要连接中只有一个保留键的表,就可以删除连接视图中的行。如果视图是使用 WITH CHECK OPTION 子句定义的,并且键保留表被重复,则无法从视图中删除行。

插入规则

INSERT 语句不得显式或隐式引用非键保留表的列。如果使用 WITH CHECK OPTION 子句定义连接视图,则不允许使用 INSERT 语句。

参考 : -

插入视图 – 代替触发器 – SQL Server

带有连接表的 Sql 可更新视图

于 2012-12-25T12:23:09.347 回答
1

你不能从视图的结果中隐藏记录吗?例如

where subscriptionID IS NOT NULL
于 2012-12-25T12:08:04.463 回答
0

我需要采取的最后一步是用我最后一次备份重新创建洞数据库,并重新创建我在备份之后创建的表。现在它也解决了我的问题。谢谢大家的回复和帮助。。

于 2012-12-26T05:49:29.680 回答
0

如果您的视图定义包含外连接,则 dbms 可能正在制造这些空值。如果您的视图需要外部连接,那么实际上没有任何方法可以绕过这些空值。如果你保留它们,那么你会看到空值。如果你隐藏它们,那么你就违背了外部连接的目的。

删除它们与所需外部连接一致的唯一方法是从保留的表中删除一行。(其键导致 dbms 制造空值的行。)

唯一可以阻止您识别保留表中的麻烦行的是视图不包含该表的任何候选键。从每个表中添加一个候选键,一次一个,直到找到正确的键。您无需更改视图定义即可执行此操作;只需将视图的 SELECT 语句复制到 SQL 窗口即可。

于 2012-12-25T12:15:35.860 回答