[英]Stored procedure returns different results when called from another server
I have created a stored procedure in Server1 that is returning the correct results Then on Server2 I just execute the Server1 stored procedure by linked server. 我在Server1中创建了一个存储过程,该存储过程返回正确的结果。然后在Server2上,我仅通过链接服务器执行Server1存储过程。
At first the return results at Server2 are the same as Server1. 首先,Server2的返回结果与Server1相同。
But after 1 or 2 days, Server2 returns some null values in some of the data. 但是在1或2天后,Server2在某些数据中返回一些空值。 But Server1 is still returning the correct results.
但是Server1仍返回正确的结果。
Result Server1: 结果服务器1:
Id Name Location Age
1 Alex USA 20
2 Bob UK 23
3 David JP 25
4 Don UK 24
Result Server2: 结果服务器2:
Id Name Location Age
1 Alex USA 20
2 Bob NULL NULL
3 David NULL NULL
4 Don UK 24
I'm only able to temporally resolve this by recompile the Server1 stored procedure. 我只能通过重新编译Server1存储过程来暂时解决此问题。 Than the Server2 will get the correct result, but after 2 days later the same problem occur again.
比Server2将获得正确的结果,但是两天后,同样的问题再次发生。
20190920 update..... include the sample of store procedure query FYI: Some NULLvalue appear in those column CASE statement 20190920更新.....包括存储过程查询样本:仅供参考:在这些列的CASE语句中出现一些NULLvalue
all the @... is input @output is declare as Table. above here is a lot of insert statement into the @Output table SELECT * FROM ( SELECT tbla.SiteName,tbla.FromWorkCenter ,tbla.Category,tbla.MaterialName,tbla.OperSeq ,tbla.FromOperSeq,tbla.StepIndex,tbla.FromStepIndex,SUM(tbla.CFqty) CFQty FROM ( SELECT tbl.SiteName ,CASE WHEN tbl.RouteName like '%REWORK%' THEN 'PS-'+tbl.ToWorkCenter WHEN isnull(tbl.FromWorkCenter,'WRH')='WRH' THEN (Select CASE Source WHEN 'TWH' THEN 'TWH' WHEN 'LWH' THEN 'LWH' ELSE 'WRH' END AS Source from DIM_MATERIAL ddm WHERE ddm.MaterialName=tbl.MaterialName AND ddm.MainCategory_wk = (SELECT TOP 1 dc.key_wk FROM DIM_Category dc WHERE dc.Category=TBL.Category)) else 'PS-'+dw.WorkCenterName END AS FromWorkCenter ,Category ,tbl.MaterialName,tbl.RouteName ,CASE tbl.OperSeq WHEN '0' THEN '10' ELSE tbl.OperSeq END AS OperSeq ,CASE rsd2.OperSeq WHEN '0' THEN '10' ELSE rsd2.OperSeq END AS FromOperSeq ,CASE WHEN rsd.RouteName LIKE '%REWORK%' THEN ( SELECT TOP 1 c.StepIndex FROM DIM_MATERIAL a JOIN DIM_MaterialStructure b on a.Key_wk=b.Material_wk JOIN DIM_ROUTESTEPDETAIL c on b.RouteName=c.RouteName and c.OperSeq=tbl.OperSeq and OperSeqFlag='TRUE' join AUDIT_JOB d on b.audit_id = d.audit_id and d.post_end_dt <= @Date WHERE a.MaterialName=tbl.MaterialName ORDER BY d.post_end_dt desc ) ELSE rsd.StepIndex end StepIndex ,CASE WHEN rsd.RouteName LIKE '%REWORK%' THEN ( SELECT TOP 1 c.StepIndex FROM DIM_MATERIAL a JOIN DIM_MaterialStructure b on a.Key_wk=b.Material_wk JOIN DIM_ROUTESTEPDETAIL c on b.RouteName=c.RouteName and c.ToOperSeq=tbl.OperSeq and OperSeqFlag='TRUE' join AUDIT_JOB d on b.audit_id = d.audit_id and d.post_end_dt <= @Date WHERE a.MaterialName=tbl.MaterialName ORDER BY d.post_end_dt desc ) ELSE rsd2.StepIndex end FromStepIndex ,(SUM(BFQty)+SUM(RtnFromQty)+SUM(RecQty)-SUM(IssueQty)-SUM(RtnToQty)-(SUM(RejQty))+SUM(TrnQty)+SUM(AdjQty)+SUM(SCQty)) AS CFQty FROM @Output TBL JOIN DIM_MATERIAL DM ON TBL.MaterialName=dm.MaterialName AND dm.MainCategory_wk = (SELECT TOP 1 dc.key_wk FROM DIM_Category dc WHERE dc.Category=TBL.Category) LEFT JOIN DIM_ROUTESTEPDETAIL rsd ON rsd.RouteName=tbl.RouteName AND rsd.OperSeq=CASE tbl.OperSeq WHEN '0' THEN '0' ELSE tbl.OperSeq END AND OperSeqFlag='TRUE' AND rsd.Site= @Company LEFT JOIN DIM_ROUTESTEPDETAIL rsd2 ON rsd2.RouteName=tbl.RouteName AND rsd2.ToOperSeq=CASE tbl.OperSeq WHEN '0' THEN '0' ELSE tbl.OperSeq END AND rsd2.OperSeqFlag='TRUE' AND rsd2.Site = CASE tbl.SiteName WHEN 'SIS' THEN 'SIS' ELSE 'INT' END LEFT JOIN DIM_WORKCENTER DW ON rsd.WorkCenter_wk=dw.key_wk WHERE tbl.SiteName=@Site GROUP BY tbl.SiteName, tbl.FromWorkCenter ,tbl.Category ,tbl.MaterialName ,tbl.RouteName,tbl.OperSeq, tbl.StepIndex,dm.Key_wk,rsd.StepIndex,tbl.RouteName, tbl.Material_WK,rsd2.OperSeq,rsd2.StepIndex,dw.WorkCenterName,tbl.ToWorkCenter, rsd.RouteName ) tbla where tbla.CFQty<>0 GROUP BY tbla.SiteName, tbla.FromWorkCenter, tbla.Category ,tbla.MaterialName,tbla.OperSeq,tbla.FromOperSeq,tbla.StepIndex,tbla.FromStepIndex ) b where b.CFQty<>0 ORDER BY b.MaterialName ,b.OperSeq ,b.SiteName ,b.FromWorkCenter ,b.Category ,b.FromOperSeq ,b.StepIndex ,b.FromStepIndex
I have found the problem. 我发现了问题。 it turn out to be the data sequence is different when query from local and remotely
事实证明,从本地和远程查询时,数据顺序不同
Result Server1: 结果服务器1:
Seq Name Location Category
1 Bob UK 20
2 Bob UK 23
Result Server2: 结果服务器2:
Seq Name Location Category
1 Bob UK 23
2 Bob UK 20
So when filtering some data is not joined properly as result null 因此,在过滤某些数据时,由于结果为null,因此未正确加入
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.