日期:2014-05-19  浏览次数:20378 次

为什么我执行语句报奇怪的错误~~~~~~~~~~~~~~~~~~~~~~~
Cannot   resolve   the   collation   conflict   between   "SQL_Latin1_General_CP850_BIN "   and   "SQL_Latin1_General_CP1_CI_AS "   in   the   equal   to   operation.


------------------------------------
SQL_Latin1_General_CP850_BIN,SQL_Latin1_General_CP1_CI_AS是什么东西啊~?

------解决方案--------------------
路过帮顶
------解决方案--------------------
那是因为你的表达式所引用的两个操作数表达式的排序规则不同。

参考:

如果复杂表达式所引用的两个操作数表达式的排序规则不同,则该复杂表达式最终结果的排序规则标志基于下列规则:

显式优先于隐性。隐性优先于强制默认。换言之,
显式 > 隐性 > 强制默认

组合两个已指派给不同排序规则的显式表达式将生成错误。
显式 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子句指定相同的排序規則.

-- 详细内容参考SQL联机丛书中的“排序规则的优先顺序”(在“索引”栏键入关键字:排序规则标签)
------解决方案--------------------
排序规则不同,在你的sql中指定排序规则