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

SQL Server调用MySQL数据源时使用参数出现排序规则冲突如何解决

问题根因

你遇到的是跨数据源字符排序规则冲突问题:通过OPENQUERY从MySQL的PLMStock数据源返回的LIBELLE字段在转换为varchar类型时默认继承了数据源的French_CI_AS排序规则,而SQL Server本地表PROFILE的PRF_NAM字段使用的是Latin1_General_CI_AS排序规则,两种不同排序规则的字段做模糊匹配时就会触发该报错。硬编码参数时SQL Server会自动将硬编码字符串转换为和匹配字段一致的排序规则,因此不会报错。

解决方案

有两种常用的修复方式,选择其中一种即可:

方案1:在模糊匹配时显式指定统一排序规则

直接在LIKE条件中对其中一个字段强制指定排序规则,统一使用其中一种即可,示例修改对应行如下:

WHERE t2.Libelle COLLATE Latin1_General_CI_AS LIKE pr.PRF_NAM + '%'

如果需要保留French排序规则的匹配逻辑,也可以反过来转本地字段:

WHERE t2.Libelle LIKE pr.PRF_NAM COLLATE French_CI_AS + '%'

方案2:从OPENQUERY读取数据时就指定统一排序规则

在转换字段类型的同时指定排序规则,避免后续匹配时重复处理:

SELECT 
    CAST(t1.CLETRI as varchar) CleTri, 
    CAST(t1.LIBELLE as varchar) COLLATE Latin1_General_CI_AS Libelle
FROM OPENQUERY("PLMStock",'SELECT CLETRI, LIBELLE FROM produits') t1 

修复后完整查询示例(采用方案1)

select sp.SLC_ID, a.ASS_NAM, p.PCE_NAM, p.PCE_DES, pr.PRF_NAM,
(
    SELECT top 1 t2.CleTri
    FROM (
        SELECT CAST(t1.CLETRI as varchar) CleTri, CAST(t1.LIBELLE as varchar) Libelle
        FROM OPENQUERY("PLMStock",'SELECT CLETRI, LIBELLE FROM produits') t1 
    ) t2
    WHERE t2.Libelle COLLATE Latin1_General_CI_AS LIKE pr.PRF_NAM + '%'
) as CLETRI
from SELECT_PART sp
left join PART p on p.PCE_ID = sp.PCE_ID
left join ASSEMBLY a on a.ASS_ID = sp.ASS_ID
left join PROFILE pr on pr.PRF_ID = p.PRF_ID
where sp.SLC_ID = 2930 and p.PRD_ID is null

内容的提问来源于stack exchange,提问作者Eric Brochu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:36:02