You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSIS包Merge Join在服务器与本地执行结果不一致问题咨询

SSIS Merge Join 全外连接在SQL Agent运行时排序异常问题

问题背景

现有一个SSIS包,使用Merge Join组件执行全外连接,两个源输入的排序语句、排序规则完全一致:

源1查询

SELECT [PolicyReference]
      ,[PolicyNarrativeReference]
      ,[PolicyNarrativeTypeCode]
      ,[PolicySystemCode]
      ,[NaturalKeyHash]
      ,[FullRowHash]
      ,[SystemName]
      ,[FunctionalEntityName]
  FROM [KeyHash].[dbo].[vw_Debug_PolicyNarrative_Server_KeyHash]
  ORDER BY [PolicyReference] COLLATE Latin1_General_CI_AS
      ,[PolicyNarrativeReference] COLLATE Latin1_General_CI_AS
      ,[PolicyNarrativeTypeCode] COLLATE Latin1_General_CI_AS
      ,[PolicySystemCode] COLLATE Latin1_General_CI_AS

源2查询

SELECT [PolicyReference]
      ,[PolicyNarrativeDate]
      ,[PolicyNarrativeReference]
      ,[PolicyNarrativeText]
      ,[PolicyNarrativeTypeCode]
      ,[PolicyNarrativeSystemCode]
      ,[PolicySystemCode]
  FROM [KeyHash].[dbo].[vw_Debug_PolicyNarrative_Server_Source]
  ORDER BY [PolicyReference] COLLATE Latin1_General_CI_AS
      ,[PolicyNarrativeReference] COLLATE Latin1_General_CI_AS
      ,[PolicyNarrativeTypeCode] COLLATE Latin1_General_CI_AS
      ,[PolicySystemCode] COLLATE Latin1_General_CI_AS

异常现象

  • 通过SQL Agent在服务器运行包时,Merge Join输出出现2995行NaturalKeyHash = 0的不匹配行:
    SELECT *
      FROM [KeyHash].[dbo].[Debug_PolicyNarrative_Server_MJ]
      where NaturalKeyHash = 0
    
  • 本地运行完全相同的包(变量、连接一致)时,排序正常,输出符合预期:
    SELECT *
      FROM [KeyHash].[dbo].[Debug_PolicyNarrative_Local_MJ]
      where NaturalKeyHash = 0
    

已验证项

已确认两个源的排序字段无重复值,验证查询如下:

-- 验证源1无重复排序键
SELECT COUNT(*)
,[PolicyReference] 
      ,[PolicyNarrativeReference] 
      ,[PolicyNarrativeTypeCode] 
      ,[PolicySystemCode] 
  FROM [KeyHash].[dbo].[vw_Debug_PolicyNarrative_Server_KeyHash]
  GROUP BY [PolicyReference]
      ,[PolicyNarrativeReference]
      ,[PolicyNarrativeTypeCode]
      ,[PolicySystemCode] 
HAVING COUNT(*) > 1

-- 验证源2无重复排序键
SELECT COUNT(*)
,[PolicyReference] 
      ,[PolicyNarrativeReference] 
      ,[PolicyNarrativeTypeCode] 
      ,[PolicySystemCode] 
  FROM [KeyHash].[dbo].[vw_Debug_PolicyNarrative_Server_Source]
  GROUP BY [PolicyReference] 
      ,[PolicyNarrativeReference] 
      ,[PolicyNarrativeTypeCode] 
      ,[PolicySystemCode] 
HAVING COUNT(*) > 1

查询结果无返回行,确认排序键唯一。


可能的原因及解决方案

1. SSIS数据源未启用"保留排序"属性

Merge Join组件要求输入数据源必须明确标记为已排序,仅在查询中加ORDER BY不足以让SSIS识别数据已排序,需手动开启数据源的保留排序属性:

  • 打开SSIS包,选中两个源的OLE DB数据源组件
  • 右键选择显示高级编辑器,切换到输入和输出属性选项卡
  • 展开OLE DB源输出,将保留排序(RetainSort)属性设置为True
  • 进一步检查每个排序字段的排序键位置(SortKeyPosition):按ORDER BY的顺序,第一个排序字段设为1,第二个设为2,以此类推(非排序字段设为0)

2. SQL Agent执行环境与本地环境的排序/区域差异

SQL Agent的执行账户与本地账户的区域设置、默认语言可能存在差异,即使查询指定了COLLATE,仍可能影响字符串的比较逻辑:

  • 检查SQL Agent服务账户的区域设置:在服务器的服务中找到SQL Server Agent,查看登录账户的区域配置
  • 在查询中强制指定所有连接键的排序规则,而非仅在ORDER BY中:
    SELECT 
        [PolicyReference] COLLATE Latin1_General_CI_AS AS PolicyReference,
        [PolicyNarrativeReference] COLLATE Latin1_General_CI_AS AS PolicyNarrativeReference,
        -- 其他字段...
    FROM ...
    ORDER BY ...
    

3. 视图底层执行计划差异

服务器与本地的执行计划可能不同(比如服务器使用了不同的索引、统计信息更新滞后),导致视图返回的实际排序顺序与预期不符:

  • 在服务器上直接执行两个源查询,将结果导出到文件,与本地执行的结果对比排序顺序
  • 更新视图底层表的统计信息:
    UPDATE STATISTICS [KeyHash].[dbo].[表名]
    
  • 为视图的排序键创建覆盖索引,强制查询按指定顺序返回数据

4. SSIS运行位数差异(32位/64位)

本地运行SSIS通常默认使用32位环境,而SQL Agent默认使用64位,不同位数下字符串处理逻辑可能存在细微差别:

  • 在SQL Agent作业的步骤中,勾选使用32位运行时选项(适用于SSIS 2012及以后版本)
  • 本地切换到64位SSIS运行包,验证是否出现同样问题,定位是否为位数导致的差异

5. Merge Join组件连接键顺序不匹配

确认Merge Join组件中设置的连接键顺序,与两个源查询的ORDER BY顺序完全一致:

  • 打开Merge Join组件编辑器,检查连接键的排列顺序,必须和ORDER BY的字段顺序一一对应(比如先选PolicyReference,再选PolicyNarrativeReference等)

内容的提问来源于stack exchange,提问作者Michael Oakman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:10:20