2009-07-14 142 views
4

我想了解我在SQL Server 2005实例上遇到的这个错误。以下错误:整理问题 - SQL Server 2005

不能在 等于操作解决“Latin1_General_CI_AI”和 “SQL_Latin1_General_CP1_CI_AI”之间的排序规则冲突 。

包含在一个简单的查询,这两个数据库有Latin1的一般CI AI,但不得不SQL Latin1的总CP1的CI AI之前。我更改了排序规则以尝试匹配它们,但每次尝试使用用户数据库中的表加入临时表时都会遇到上述错误。我没有创建临时表的问题。

+0

正是我想了解的是为什么我得到错误,如果我的临时数据库和我的用户数据库都有相同的排序选项。 – Joel 2009-07-14 15:26:11

+0

通过在导致排序问题的联接之后添加COLLATE DATABASE_DEFAULT,我的问题得到了解决。我能够使查询以这种方式工作,但我仍然对此排序规则问题感到困惑,因为我不完全了解是什么导致问题 – Joel 2009-07-15 15:19:46

+0

有趣,您说database_default解决了您的问题,但您接受了不同的答案;) – 2009-07-16 00:09:12

回答

6

当你加入,你可以使用COLLATE改变对飞的整理,使他们相同的:

select c.name, o.orderid from customer as c 
inner join order as o on c.custid = o.custid COLLATE SQL_Latin1_General_CP1_CI_AI 

假设卡斯特是SQL_Latin1_General_CP1_CI_AI和秩序是其他一些整理,上面的查询会解决问题。

3

查看表格设计,您进行连接的两个字段具有相同的排序规则设置。

ALTER TABLE <table> 
ALTER COLUMN <column> VARCHAR(200) COLLATE Latin1_General_CI_AI 
GO 
+0

最好是像tricat提议的那样更改列排序规则,因为有时候查询中的排序规则指令是不够的,因为部署应用程序时SQL Server配置的差异 – 2011-07-02 16:40:37

2

如果创建一个临时表和你 数据库有不同的排序规则 比tempdb以外(具有相同 归类作为系统 - 基于 安装),然后 比较/查找/加入 - 可能有 问题。一个简单的技巧绕开 这是使用database_default:

CREATE TABLE #test2 
(
    col1 varchar(12) COLLATE database_default 
) 
go 

回复。 Changing Database Collation and dealing with TempDB Objects

您是否在更改数据库的整理顺序后重建所有索引?

1

我在不同排序规则的服务器之间移动数据库时遇到了非常相似的问题。数据库遇到了原始的排序规则,但是由于新服务器的排序规则(以及因此tempdb数据库的排序规则)不同,因此在创建临时表并尝试与其联合时会造成问题。

如果你说你的数据库的排序规则与服务器的排序规则相同,那么我猜你必须有一些使用不同排序规则的列。 (您可以逐列更改排序规则)。

无论如何,我总是通过改变整个数据库的排序规则来处理这些问题,以便在恢复之后匹配目标服务器。这是一个PITA手动执行,但幸运的是有一个tool来做到这一点。

0

从我记得的内容来看,如果您使用的是内存中的tempDb,它会根据需要重新创建。因此,如果您的Model数据库具有不同的排序规则,则新建的数据库(如tempDb)将从Model继承它。