日期:2014-05-18  浏览次数:20482 次

一个连接服务器查询的问题
SELECT   a.*   FROM         SVRLink.TajimaMrp.dbo.v_itemviewforinet   a   join   customer   b   on   a.ItemID=b.CustNO

select   a.*   from   SVRLink.TajimaMrp.dbo.v_itemviewforinet   a   join     UserData   b   on   a.ItemID=b.nvarchar4


两条语句,第一条能够正确执行,第二条出现下面的错误

服务器:   消息   446,级别   16,状态   9,行   1
Cannot   resolve   collation   conflict   for   equal   to   operation.

两条语句在两个数据库中执行,请问这可能是什么原因

------解决方案--------------------
是否存在UserData表并且表中有nvarchar4字段吗?

------解决方案--------------------
用openquery进行分布式查询试试呢
select * from
openquery(SVRLink, 'select a.* from TajimaMrp.dbo.v_itemviewforinet a join UserData b on a.ItemID=b.nvarchar4 ')
------解决方案--------------------

Transact-SQL 参考


排序规则的优先顺序
排序规则的优先顺序(也称为排序规则类型强制规则)是赋予一组规则的术语,而这组规则决定:

取值为字符串的表达式的最终结果的排序规则。


区分排序规则的运算符所使用的排序规则,这些运算符使用字符串输入但不返回字符串,如 LIKE 和 IN。
排序规则的优先顺序规则只适用于字符串数据类型:char、varchar、text、nchar、nvarchar 和 ntext。具有其它数据类型的对象不参加排序规则的评估。

所有对象的排序规则可归为四类中的一种。每类的名称叫做排序规则标志。

排序规则标志 对象类型
强制默认 任何 Transact-SQL 字符串变量、参数、字面值、目录内置函数的输出、或不使用字符串输入但产生字符串输出的内置函数。
如果在用户定义函数、存储过程或触发器中声明某个对象,则将该对象指派为在其中创建函数、存储过程或触发器的数据库的默认排序规则。如果在批处理中声明该对象,则将其指派为连接所使用的当前数据库的默认排序规则。

隐性 X 列引用。从为表或视图中的列定义的排序规则得到表达式(由 X 表示)的排序规则。
即使 CREATE TABLE 或 CREATE VIEW 语句中的 COLLATE 子句给列显式指派了排序规则,该列引用仍归为隐性。

显式 X 使用表达式中的 COLLATE 子句显式投影到特定排序规则(由 X 表示)的表达式。
无排序规则 表示表达式的值是两个字符串之间操作的结果,而这两个字符串具有隐性排序规则标志的冲突排序规则。表达式的结果被定义为不具有排序规则。


只引用一个字符串对象的简单表达式的排序规则标志是被引用对象的排序规则标志。

如果复杂表达式所引用的两个操作数表达式的排序规则标志相同,则该复杂表达式的排序规则标志为数表达式的排序规则标志。

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

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

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

下面查询中的 case 表达式没有排序规则标志,所以不能出现在选择列表中,也不能由区分排序规则的运算符操作。不过,这些表达式可由不区分排序规则的运算符操作。

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab

下面是结果集。

Msg 451, Level 16, State 1, Line 1
Cannot resolve collation conflict for column 1 in SELECT statement.

SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a ')
FROM TestTab