2010-10-05 355 views
23

我得到这个错误,同时开发存储过程SQL Server错误“隐式转换,因为排序规则冲突造成值的排序规则未解决。”

VARCHAR值到VARCHAR的隐式转换无法执行,因为该值的排序规则是未解决由于排序规则冲突。

说法是这样的

Select City COLLATE DATABASE_DEFAULT AS Place, State, Country FROM DEPT1 
UNION ALL 
Select '' AS Place, 'Arizona' As State, Country FROM DEPT2 

但如果如果做到这一点也得到同样的错误

Select City COLLATE DATABASE_DEFAULT AS Place, State, Country FROM DEPT1 
UNION ALL 
Select '' COLLATE DATABASE_DEFAULT AS Place, 'Arizona' As State, Country FROM DEPT2 

其实这个代码是由另外一个人写的和我只是编辑代码,不知道他为什么加入COLLATE DATABASE_DEFAULT,但如果我删除它也会给出相同的错误

无法执行varchar值到varchar的隐式转换,因为由于排序规则冲突导致值的排序规则未解决。

回答

46

在两个地方最有可能需要COLLATE。

Select City COLLATE DATABASE_DEFAULT AS Place, State, Country FROM DEPT1 
UNION ALL 
Select '' COLLATE DATABASE_DEFAULT AS Place, 'Arizona' As State, Country FROM DEPT2 

编辑:您可能需要在每一个字符串,如果你在一个地方

Select 
    City COLLATE DATABASE_DEFAULT AS Place, 
    State COLLATE DATABASE_DEFAULT AS State, 
    Country COLLATE DATABASE_DEFAULT AS Country 
FROM DEPT1 
UNION ALL 
Select 
    '' COLLATE DATABASE_DEFAULT, 
    'Arizona' COLLATE DATABASE_DEFAULT , 
    Country COLLATE DATABASE_DEFAULT 
FROM DEPT2 

EDIT2得到它:

这是因为你的列排序规则可能是你的数据库归类不同。所以“城市”有一个整理,但字符串常量有另一个。

+0

是...但它也给了同样的错误 – Azhar 2010-10-05 07:58:02

+1

如何我都从我的声明删除此COLLATE DATABASE_DEFAULT ......为什么是否强制使用这...实际上有一个声明有45列和关于工会所有的6个声明,多于一半是字符串... – Azhar 2010-10-05 08:13:25

+0

这是一个很好的技巧,当我正在处理选择从几个SYS表(或视图)来找出什么权限授予我所有的服务器登录(委托人)被给予。 – NateJ 2016-03-03 01:04:38

1

ALTER TABLE DEPT1和DEPT2使表导致定义不包含任何COLLATE