Sql server 2005 SQL Server返回不一致的结果

Sql server 2005 SQL Server返回不一致的结果,sql-server-2005,Sql Server 2005,我正在编写一些在我开始当前工作之前创建的报告。其中一个报告基于SQL Server 2005视图 这个视图非常大和笨拙,现在,我不会发布它,因为我觉得它太大了。我不确定它是如何产生的——我猜它是在设计师那里产生的,因为我看不到有人真的在写这样的东西。它有好几页长,参考了其他5个视图。一句话——这很复杂,需要重构/重新设计,但在我们有时间之前,我们会一直坚持下去 无论如何,我必须对其进行一些小的非功能性更改,以便将其移动到不同的数据库和模式。为了确保我没有改变它实际返回的内容,我修改了视图的第二个

我正在编写一些在我开始当前工作之前创建的报告。其中一个报告基于SQL Server 2005视图

这个视图非常大和笨拙,现在,我不会发布它,因为我觉得它太大了。我不确定它是如何产生的——我猜它是在设计师那里产生的,因为我看不到有人真的在写这样的东西。它有好几页长,参考了其他5个视图。一句话——这很复杂,需要重构/重新设计,但在我们有时间之前,我们会一直坚持下去

无论如何,我必须对其进行一些小的非功能性更改,以便将其移动到不同的数据库和模式。为了确保我没有改变它实际返回的内容,我修改了视图的第二个版本。让我们调用第一个视图vw_Data1和我的新视图vw_Data2。现在,如果我写:

SELECT Count(*) FROM
(
SELECT * FROM vw_Data1
UNION
SELECT * FROM vw_Data2
)
然后我就应该像刚才那样得到同样的号码

SELECT Count(*) FROM vw_Data1
只要vw_Data1和vw_Data2返回相同的行,这就是我要检查的

然而,我发现如果我多次运行上面的UNION查询,每次都会得到不同的结果

所以,我要说清楚,如果我跑步:

SELECT Count(*) FROM
(
SELECT * FROM vw_Data1
UNION
SELECT * FROM vw_Data2
)
不止一次,每次我都会得到不同的结果

正如我所说,我还没有发布实际的代码,因为我想问的第一件事就是——一个查询究竟如何返回不同的结果

使用了一个非确定性函数,该函数是以下函数的一部分:

LEFT OUTER JOIN dbo.vwuniversalreportingdata_budget 
     ON 



CASE
    WHEN dbo.f_tasks.ta_category = 'Reactive' THEN
        CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10)) 
            + ' | ' 
                + CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10)) 
                    + ' | ' 
                        + CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_sched_date)) AS VARCHAR(10))
    WHEN dbo.f_tasks.ta_category = 'Planned' THEN
        CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10)) 
            + ' | ' 
                + CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10)) 
                    + ' | ' 
                        + CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_est_date)) AS VARCHAR(10))
    WHEN dbo.f_tasks.ta_category = 'Periodic' THEN
        CAST(dbo.f_tasks.ta_fkey_fc_seq AS VARCHAR(10)) 
            + ' | ' 
                + CAST(dbo.f_tasks.ta_fkey_fcc_seq AS VARCHAR(10)) 
                    + ' | ' 
                        + CAST(YEAR(DATEADD(MONTH, -3, dbo.f_tasks.ta_est_date)) AS VARCHAR(10))
END
= dbo.vwuniversalreportingdata_budget.id 

整个问题都像这样令人恶心。无论如何,任何关于如何实现这一点的想法都将受到感激。这可能与工会有关吗?我不知道。救命啊

你可能已经调查过两个明显的原因。当前日期时间不同,会影响结果。源数据已在两次运行之间更新。如果它像您所说的那样可复制,请删除select count*并区分不同的输出。同意Lieven。将两者完全连接起来,仅在vw_Data1.ID不为NULL或vw_Data2.ID不为NULL的情况下输出。大家好。好吧,我想到了datetime的事情——下面有更多的内容。Re:源数据发生了变化,这绝对不会发生,因为我正在开发一台其他人都无法访问的服务器。Lieven,不幸的是,这些视图没有唯一的ID,所以我不能像你说的那样进行检查-但是,我做了一些稍微不同的事情-见下文。此后我又遇到了同样的问题。这一次我把它缩减到更容易管理的地方。所以以下查询不应返回任何内容:选择f\u payments内部联接f\u po\u head poh ON Payment f\u poh seq=poh seq内部联接f\u Supply Supp ON poh f\u sup seq=sup_seq GROUP BY Payment发票编号,但选择f\u payments Payment内部联接f\u po\u head poh ON Payment poh ON Payment f\u poh seq=poh Upply Supply Supply Supply Supply Supp ON Payment ON Paymentpoh_fkey_sup_seq=按已付发票编号分组的sup_seq