4

我创建了以下简单视图:

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 语句

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

它返回 277488 行

谁能建议为什么视图缺少 SELECT 语句返回的 1112 行。

4

3 回答 3

7

如果从视图中选择和临时运行其定义之间确实存在差异,我会:

  • 运行sp_refreshview
  • 运行dbcc checkdb
  • 删除并重新创建视图
  • 确保将 SQL 修补到最新的服务包
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 重新启动 SQL Server 实例(我们现在开始到达)?
  • 重启服务器?
  • 联系支持服务(这会变得很严重)。

不过,在执行任何这些操作之前,看看执行计划、统计 io 等是否存在差异会很有趣。

于 2013-02-11T22:29:23.980 回答
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
于 2013-02-11T21:39:54.970 回答
0

刚刚与 SQL2008 实例有同样的问题。当我右键单击并将视图编写为创建脚本时,我可以清楚地看到视图定义中的硬编码值是“A”。但是,当我右键单击并选择前 1000 行时,没有返回硬代码。看起来,正在执行一组完全不同的代码。奇怪!挑战我所知道的关于数据库的一切。一定是 SQL Server 内部的一些奇怪的错误,或者尽管视图被修改,但奇怪的数据缓存检索......没有 Windows 功能,不涉及事务......我正在处理一组静态数据以进行数据迁移,不是实时系统。

当我从视图中选择 TOP 1000 来合并视图定义时,我收到有关列定义不匹配的错误,因此显然有些东西不同步。

I recompiled the view and the issue went away.

于 2017-08-25T21:42:22.803 回答