2013-02-11 53 views
3

我创建了以下简单的观点:SQL Server视图导致不同的SELECT

CREATE VIEW cs.MyTestPO AS 
SELECT ttdpur401100.t_orno 
, ttdpur401100.t_item 
, ttcibd001100.t_dsca 
FROM ttdpur401100 
    JOIN ttcibd001100 ON ttcibd001100.t_item = ttdpur401100.t_item 

然后SELECT * FROM cs.MyTestPO回报276376行

如果我本身

SELECT ttdpur401100.t_orno 
, ttdpur401100.t_item 
, ttcibd001100.t_dsca 
FROM ttdpur401100 
    JOIN ttcibd001100 ON ttcibd001100.t_item = ttdpur401100.t_item 

运行SELECT语句它返回277488行

任何人都可以说明为什么认为我缺少SELECT语句返回的1112行。

+3

在从视图中选择数据之后,但在从查询中选择之前,是否可能添加了1112行? – 2013-02-11 21:35:51

+0

从视图中选择和选择直接相继运行多次,并产生相同的结果。 – Mike 2013-02-11 21:47:14

+0

将它们放入事务中,并在结果集上使用DISTINCT重新运行。我猜这个观点正在强化独特性。 – 2013-02-11 21:49:07

回答

1

看到集之间的差异,尽量

SELECT d 
d.t_orno , d.t_item , c.t_dsca 
FROM ttdpur401100 d 
    inner JOIN ttcibd001100 c ON 
c.t_item = d.t_item left outer join 
cs.MyTestPO t on d.t_item = t.t_item 
where 
t.t_item is null 
+0

我已经从视图中识别出缺失的行,但我看不到从视图结果中选择它们的任何原因。有什么我应该检查? – Mike 2013-02-11 22:08:22

+0

检查表c上的行数是否与视图或选择行数匹配? – Beth 2013-02-11 22:28:42

+0

表c没有与视图或选择行数相同的行数。但那又如何? – Mike 2013-02-11 22:54:45

3

如果真正从一个视图中选择并运行它的定义点对点之间的区别,我想:

  • 运行sp_refreshview
  • 运行dbcc checkdb
  • 删除并重新创建视图
  • 确保将SQL修补至most recent service pack
  • ~~~~~可能很多,一个MVP会想到其他步骤去这里~~~~~
  • 重新启动SQL Server实例(我们已经开始到达,现在)?
  • 重新启动服务器?
  • 联系support services(这会变得越来越严重)。

虽然,在执行此任务之前查看执行计划,统计信息等是否存在差异会很有趣。

+0

我们有两天的重新计划,所以我会再检查一次。 – Mike 2013-02-11 22:51:57

+0

sp_refreshview没有做任何事吗?与往常一样,使用需要您自担风险,但我会毫不犹豫地在生产环境中运行它(首先尝试测试),尤其是如果我无论如何都收到了错误的数据。 – 2013-02-11 22:58:22

+0

否 - 我删除VIEW并重新创建它。我推测会有更多的影响? – Mike 2013-02-12 01:53:12

0

刚刚有一个与SQL2008实例相同的问题。当我右键单击并将我的视图脚本化为create时,我可以清楚地看到视图定义中的硬编码值为'A'。但是,当我右键单击并选择前1000行时,硬编码未被返回。表面上看,一组完全不同的代码正在执行。离奇!无视我所知道的关于数据库的一切。必须是SQL Server的内核中的一些奇怪的错误,或者尽管视图被修改了奇怪的数据缓存检索...没有窗口功能,没有涉及的交易...我正在针对数据迁移的静态数据集,不是现场系统。

当我UNION与选择TOP 1000从视图中我得到的不匹配列定义的错误视图定义,所以很明显的东西的失同步。

我重新编译了视图,问题就消失了。