排序规则不一致导致比较报错怎么办
两表连接/比较报「无法解析排序规则冲突」的原因:两侧排序规则不同,用 COLLATE 显式指定或统一排序规则。
简短答案
两个表的字符串列排序规则不同(如一个 Chinese_PRC、一个 Latin1_General),直接比较/连接会报「无法解析排序规则冲突」。临时用 COLLATE 显式指定,长期统一库内排序规则。
排查步骤
- 查各表列的排序规则:
SELECT t.name AS table_name, c.name AS col, c.collation_name
FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.type IN ('char','varchar','nvarchar','nchar','nvarchar','text','ntext');
- 查库默认排序规则:
SELECT collation_name FROM sys.databases; - 临时解法——比较处显式指定同一排序规则:
SELECT * FROM a
JOIN b ON a.列 COLLATE Chinese_PRC_CI_AS = b.列 COLLATE Chinese_PRC_CI_AS;
- 长期方案:新库建库时统一排序规则;旧库改列排序规则用
ALTER TABLE ... ALTER COLUMN(会重建该列,生产库要择时)。 - 在 SSMS 表设计器里可看列属性中的排序规则。
- 各版本排序规则支持范围以 SQL Server 2022 Developer 条目页核对。
现象对照表
| 现象 | 原因 |
|---|---|
| 两表 JOIN 报排序规则冲突 | 列排序规则不同 |
| 与字面量比较报错 | 列排序规则非库默认 |
| 跨库连接报错 | 两库默认排序规则不同 |
操作小结
- 先查列的 collation_name,确认两侧差异。
- 临时用 COLLATE 兜底,长期统一排序规则。
- 改列排序规则要评估重建成本。