大家是否遇见过这个问题,SQLServer2000执行同一存储过程,在数据库数据相同的前提下,多次执行,返回结果偶尔会有不一致的情况。
我们的存储过程有450行,涉及到多个表的关联查询,返回结果在50万条左右。

解决方案 »

  1.   

    汗,能不同?
    SELECT TOP 5 * FROM TB ORDER BY NEWID()如果有这样就会不同
      

  2.   

    如果中间有GETDATE之类的会不一样,再就是有实时修改数据的时候
      

  3.   

    感谢大家回复。
    首先说数据肯定没有变化,我试验时是把生产数据库copy了一份作为Test环境,在那里做的实验。而且发现的现象是比如连续调用该存储过程30次,可能在中间某次出现返回结果不全,而其他的29次返回的都是一样的,如果是数据变化了,那应该是从中间某次开始,后面那些次的结果都变化了;而且存储过程的参数肯定也没有变化;
    其次我的存储过程里面没有类似SELECT TOP 5 * FROM......的语句,也同样没有使用GETDATE函数;
    而且我在这里贴出存储过程的代码没有太大意义,首先要执行它还要有那些相关的表,为了保证这个现象能够重现,还要有足够量的数据,而且我的存储过程肯定是没有语法错误的。
    这个问题在网上搜索,发现SQL2000的确有这个现象,微软也为此发过一些补丁,我目前打到的补丁是8.0.2040,比SP4稍高一点,而且我们在发现这个问题之后,也把该存储过程重写了一下,之后的确没再发现这个问题,但是这个问题的出现是随机的,没发现不等于完全避免了;而且我们的系统和财务相关,用户要求统计出来的数据务必准确,有这种错误是不允许的。我目前能想到的最好办法,也就是把同样的存储过程执行两遍,然后比较他们的结果,如果两者相同,则说明返回的结果是正确的,然后show给用户,但是这样做对系统资源的消耗就会加倍,所以我在这里想问问大家有没有见过这个问题,以及有无更好的解决办法,哪怕微软有专门的补丁是针对这个问题的,我们也可以安装该补丁。
      

  4.   


    code56709951兄,你说的这个原因我倒是考虑过,可是我这个存储过程是只读的,它本身并没有写操作,如果其他查询有写操作,会对本查询的读操作有影响么?
    你能否说的再详细些?
      

  5.   

    如果纯select的话,可以在from的表上加上nolockselect * from T (nolock)
      

  6.   

    如果有相关的表被锁住,那么难道SQL就会放弃读取该表的数据,而直接返回不完全的结果?而不是等待该表解锁再继续读取?