SQL跨数据库查询出现排序规则冲突错误468 如何解决
报错原因
该468错误是跨数据库查询的典型问题:两个数据库的默认排序规则不同,本次查询用于关联匹配的LBrCode、PrdAcctId两个字符串字段分别来自不同数据库,继承了各自所属数据库的排序规则,等值匹配时系统无法自动适配两种排序规则,因此触发冲突。
修复方案
临时修复(仅对当前查询生效,无业务影响,优先推荐)
只需要在关联条件中为字段手动指定统一的排序规则即可,可选择COLLATE DATABASE_DEFAULT强制使用当前查询所在库的排序规则,也可以直接指定两种排序规则中的任意一种做统一。
修改后的完整查询代码如下:
WITH main AS ( SELECT a.LBrCode,a.PrdAcctId,b.SexCode,a.DateOpen, case when (a.AcctStat=3 and a.DateClosed>'30-jun-2021') or a.AcctStat<>3 then 'live' else 'cl' end r1 FROM ac_mast a INNER JOIN prd_mat b ON a.CustNo=b.CustNo WHERE rtrim(substring(a.PrdAcctId,1,8)) IN ('abc') AND a.AcctType=32 ), card_data AS ( SELECT substring(b.primary_a_c_number,1,3) LBrCode, substring(b.primary_a_c_number,4,4)+replicate(' ',4)+replicate('0',8)+substring(b.primary_a_c_number,8,8)+replicate('0',8) PrdAcctId, card_number,card_process_date,first_tran_date FROM [hk_RDS2.0].dbo.cardx1 b ) select a.LBrCode,a.PrdacctId,b.Card_number from main a inner join card_data b on a.LBrCode = b.LBrCode COLLATE DATABASE_DEFAULT and a.PrdAcctId = b.PrdAcctId COLLATE DATABASE_DEFAULT
注:如果要指定固定排序规则,把
DATABASE_DEFAULT替换为SQL_Latin1_General_CP1_CI_AS或者SQL_Latin1_General_CP850_BIN2均可,只要两边关联字段使用同一种排序规则即可。
永久修复(需评估业务影响)
如果业务场景经常需要在两个库之间做跨库关联查询,可以通过统一排序规则从根源解决问题:
- 统一两个数据库的默认排序规则,执行命令:
ALTER DATABASE 数据库名称 COLLATE 目标排序规则名称; - 也可仅修改关联用到的字段的排序规则,避免改动全库配置,执行命令示例:
ALTER TABLE 表名 ALTER COLUMN 字段名 字段原有类型 COLLATE 目标排序规则名称 [原有非空/默认值约束]; - 操作前必须做好全量数据备份,提前评估对现有业务查询、索引的影响,避免引发其他隐性异常。
内容的提问来源于stack exchange,提问作者hemu_k
相关产品推荐
相关产品推荐

