在大的公司,每个系统都有相应的DB,而他们排序规则又不相同,造成数据经常发生Cannot resolve collation conflict for equal to operation.错误,这是因为你的表达式所引用的两个操作数表达式的排序规则不同。
如果复杂表达式所引用的两个操作数表达式的排序规则不同,则该复杂表达式最终结果的排序规则标志基于下列规则:
显式优先于隐性。隐性优先于强制默认。换言之,
显式 > 隐性 > 强制默认
组合两个已指派给不同排序规则的显式表达式将生成错误。
显式 X + 显式 Y = 错误
组合两个具有不同排序规则的隐性表达式将产生无排序规则。
隐性 X + 隐性 Y = 无排序规则
将无排序规则的表达式与任何标志的表达式组合,除了显式排序规则外(参见下一项),都产生无排序规则标志的结果。
无排序规则 + 任何标志 = 无排序规则
将无排序规则的表达式与显式排序规则的表达式组合将产生具有显式标志的表达式。
无排序规则 + 显式 X = 显式
下面的示例说明上述规则。
USE tempdb
GO
CREATE TABLE TestTab (
id int,
GreekCol nvarchar(10) collate greek_ci_as,
LatinCol nvarchar(10) collate latin1_general_cs_as
)
INSERT TestTab VALUES (1, N'A', N'a')
GO
下面查询中的谓词具有排序规则冲突,因此产生错误:
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol
下面是结果集。
Msg 446, Level 16, State 9, Server CTSSERV, Line 1
Cannot resolve collation conflict for equal to operation.
下面查询中的谓词在排序规则 greek_ci_as 中取值,因为右边表达式具有显式标志,优先于右边表达式的隐性标志:
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as
下面是结果集。
id GreekCol LatinCol
----------- -------------------- --------------------
1 a A
(1 row affected)
---------------------------------------------------------------
1、轉成UNICODE
2、SQL2K可用COLLATE子句指定相同的排序規則.