Sql 数据库视图不反映下表中的数据 输入:
客户声称,应用程序(.NET)在查询某些数据时返回的数据与客户直接查看数据表时返回的数据不同 我知道可能有各种原因,在完全不同的地方。我的目的不是在这里解决它,而是询问有经验的DBA和DB开发人员是否: 视图是否可能显示与基础表不匹配的数据?Sql 数据库视图不反映下表中的数据 输入:,sql,sql-server,schema,Sql,Sql Server,Schema,客户声称,应用程序(.NET)在查询某些数据时返回的数据与客户直接查看数据表时返回的数据不同 我知道可能有各种原因,在完全不同的地方。我的目的不是在这里解决它,而是询问有经验的DBA和DB开发人员是否: 视图是否可能显示与基础表不匹配的数据? 可能的原因是什么? 视图上的UPDATE语句是否会导致future Select返回“已更新”的数据,而表实际上不返回 可能的原因(请对带问号的进行评论): 原因是有两个独立的交易,这将解释客户的困惑 基础表已更改,但视图未刷新(使用sp_refres
- 可能的原因是什么?
- 视图上的UPDATE语句是否会导致future Select返回“已更新”的数据,而表实际上不返回
选择。。。对于更新
导致此?SELECT*…
子句时,那个伟大的家伙改变了列的顺序,以查看表开头的几个审计字段
使用数据库模式与问题出现前几天备份的模式进行了比较,发现了列位置的差异
接下来发生的事情与编程无关,更多的是一个政治问题
因此,
sp_refreshview
就是解决方案。我只是又多走了一步,想找出是谁造成了这个问题。谢谢大家。如果基础表已更改,并且sp_refreshview未针对该视图运行,则该视图可能会丢失添加到表中的列
要了解我的意思,请阅读确定还有其他内容:
1) Derived attributes are pulling from wrong tables in the view
2) The view is using incorrect tables
3) incorrect or missing joins in the view
举几个例子是的,有点
可能的原因:
- 您的.NET应用程序可能没有指向您或他们认为它指向的地方。例如,它错误地指向测试服务器
- 如果视图的索引为浮点值或数值,则由于舍入,该值可能与基础查询不同
- ANSI_NULLS设置特定于创建视图时的视图。如果它与基础表的选择期间的设置不同,则可能会导致某些类型的查询出现差异
- 基础表结构已更改,视图尚未刷新(尤其是在使用“SELECT*”时出现问题)
SET ANSI_NULLS ON
DECLARE
@i INT,
@j INT
SET @i = NULL
SET @j = 1
SELECT
CASE WHEN @i <> @j THEN 'Not Equal' ELSE 'Equal' END
SET ANSI_NULLS OFF
SELECT
CASE WHEN @i <> @j THEN 'Not Equal' ELSE 'Equal' END
假设视图没有实际转换数据,从技术上讲,如果发生损坏,则是可能的。视图从一个索引检索数据,“表”从另一个索引检索数据(即从集群),而这两个索引不同步。DBCC CHECKDB应该会发现问题
但人为错误的可能性更大,即,他们查看的表与视图不同,或者查看的记录也不同。您可以创建带有锁定提示的视图,这意味着您可能会收到脏读。或者,当他们直接访问表时,他们可能正在使用锁定提示,这可能会在此时给他们一个脏读
用户似乎不理解的另一种可能性是数据是流动的。3:00在视图中读取的数据可能与3:30直接查看表时看到的数据不同,因为在此期间发生了更改。+1对此,更改表结构时必须刷新视图,否则会发生奇怪的事情。@birdlips。对不起,伙计。不寻找程序员的错误。寻找由于其他因素(当然也包括人为因素)可能导致这种不一致的情况@Tom。你可以评论更多或添加链接到ANSI_NULLS相关的原因。谢谢。我在上面的帖子中加入了一个例子(注释中的代码不太好用)哈哈,我不能告诉你我们有多少bug,有人在那里寻找的QA信息只在prod.Heh上。是的,我花了很多时间(虽然有利可图)陪客户处理类似的案例。有一半的时间,直截了当的提问是不起作用的:“你确定你在生产吗?是的。”+2小时:“你确定吗?是的。”+3小时:“那么你确定吗?”(愤怒随之而来)。所以现在我用一些问题来掩饰它,比如“它在查询窗口状态栏左侧的第三个单元格中说了什么?.QA?那是你的QA数据库吗?”
Equal
Not Equal