日期:2014-05-17  浏览次数:20580 次

同一條SQL語句,兩次運行為何會有不同的結果
有兩個實例   MSSM1   和   MSSM2     在不同的PC上,

有一條SQL語句,訪問的表都在  MSSM2   上, 

------------------------------以下為該SQL語句在MSSM1上的執行情況----------------------------

該語句在 MSSM1 的環境下執行,因為兩個實例沒有互相註冊,所以在SQL語句中,所有的table前都加了連接字串:
from OPENDATASOURCE('sqloledb','data source=10.10.10.10;user id=sa;password=xxxxx').dbname.dbo.table1
a,

    OPENDATASOURCE('sqloledb','data source=10.10.10.10;user id=sa;password=xxxxx').dbname.dbo.table2 b,
……………………
最後得到的結果集有505條記錄

--------------------以下為該SQL語句在MSSM1上的執行情況------------------------
將該SQL語句COPY到MSSM2的環境下執行,因為要訪問的table都在本地,所以去掉了table前面的連接字串: 
from dbname.dbo.table1
a,dbname.dbo.table2 b,
……………………
得到的結果集有560條數據!

--------------------以下為多次驗證的執行情況------------------------
嘗試多次,兩次執行的結果還是不一致,十分鬱悶,這可是同一條SQL語句,只是因為去掉了table前面的連接字串,爲什麽運行結果不一致呢。
1、我都是在SA賬號下執行的,所以不會是權限方面的問題
2、SQL語句我是複製黏貼來執行的(僅僅只是去掉table前面的連接字串),且重複過多次,所以不會是SQL語句輸錯的問題
3、我請其他同事幫我驗證,他們得到的結果跟我一樣,所以也不應該是環境的問題

最後我直接將MSSM1上執行的SQL語句直接COPY到MSSM2的環境上,這次我沒有去掉table前的連接字串,與在MSSM1上執行的結果相同,是505條記錄。


請有遇到過這種情況的大俠講解一下原因,小弟不勝感激!


------解决方案--------------------
照理应该是不可能的,难道是排序规则的影响.
------解决方案--------------------
或者是分布式事务方面的问题,这个确实很难定位问题到底在哪儿,只能通过尝试,发现问题。
------解决方案--------------------
模拟一下上边环境然后测试一下不就知道了 。
------解决方案--------------------
检查MSSM1,MSSM2的dbname数据库排序规则是否一致,

-- 2个实例各执行一次.
select @@servername 'SvrName',
       name 'DBName',
       collation_name
 from sys.databases
 where name='[数据库名]'

------解决方案--------------------
引用:

加了order by 的結果

个人认为不会,虽然你在远程执行,但是在本机还是可以抓到在本机运行的SQL语句,单独拎出来执行看看效果。
------解决方案--------------------
怀疑数据不是静止的喔..