【问题标题】:Collation Problem - SQL Server 2005排序规则问题 - SQL Server 2005
【发布时间】:2009-07-14 15:04:55
【问题描述】:

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

无法解决排序规则冲突 在“Latin1_General_CI_AI”和 “SQL_Latin1_General_CP1_CI_AI”中的 等于运算。

简单查询中包含的两个数据库都有Latin1 General CI AI,但之前有SQL Latin1 General CP1 CI AI。我更改了排序规则以尝试匹配它们,但每次尝试将临时表与用户数据库中的表连接时仍然会出现上述错误。创建临时表没有问题。

【问题讨论】:

  • 正是我想要理解的是,如果我的临时数据库和我的用户数据库具有相同的排序选项,我会收到错误消息。
  • 我通过在导致排序规则问题的连接之后添加 COLLATE DATABASE_DEFAULT 半解决了我的问题。我能够以这种方式进行查询,但我仍然对这个排序规则问题感到困惑,因为我不完全了解导致问题的原因
  • 有趣的是,您说 database_default 解决了您的问题,但您接受了不同的答案;)
  • 我按照您的建议将 collat​​e 命令应用于连接而不是列属性定义。尽管您在同一条线上,但我认为我接受的答案更接近了。谢谢!

标签: sql-server sql-server-2005


【解决方案1】:

加入后,您可以使用 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

假设 cust 是 SQL_Latin1_General_CP1_CI_AI 并且 order 是其他排序规则,上述查询将解决问题。

【讨论】:

  • 即使您更改了数据库排序规则,对象排序规则仍然是旧的。右键单击表格,转到属性。你会看到它在旧的排序规则上。
  • 我按照你说的做了。至于属性页显示,数据库对象继承了正确的排序规则设置,这让我感到困惑。似乎它只发生在临时表上。
  • 默认更改数据库排序规则不会更改其中对象的排序规则。所以奇怪的是他们得到了新的排序规则,除非它们是在数据库排序规则更改之后创建的。在这种情况下,无论如何它必须是 TempDB 的整理 - 放置临时表的地方。
【解决方案2】:

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

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

【讨论】:

  • 最好像tricat建议的那样改变列排序规则,因为有时在部署应用时SQL Server配置不同,查询中的排序规则不够用
【解决方案3】:

如果您创建一个临时表并且您的 数据库有不同的排序规则 除了 TempDB(具有相同的 作为系统的排序规则 - 基于 安装),然后 比较/查找/连接 - 可能有 问题。一个简单的技巧来解决 这是使用database_default:

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

回复。 Changing Database Collation and dealing with TempDB Objects

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

【讨论】:

  • 如果我的两个 tempDB 与我尝试加入的数据库具有相同的排序规则怎么办?
  • 您可能更改了数据库排序规则,但这不会更改数据集中对象的排序规则。右键单击表格,转到属性。你会看到它有旧的排序规则。
  • 我没有重建所有索引。
  • 您应该在更改数据库的排序顺序后重建所有索引。
【解决方案4】:

在具有不同排序规则的服务器之间移动数据库时,我遇到了听起来非常相似的问题。数据库遇到了它的原始排序规则,但是由于新服务器的排序规则(以及因此 tempdb 数据库的排序规则)不同,所以当我创建一个临时表并尝试加入它时会导致问题。

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

无论如何,我总是通过在还原整个数据库后更改整个数据库的排序规则以匹配目标服务器来处理这些问题。这是一个手动执行的 PITA,但幸运的是有一个 tool 可以执行此操作。

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • tempDB 总是继承 Model 的排序规则,不管它是否在内存中(很少)。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 2011-03-28
    • 2012-02-22
    • 2011-11-04
    • 2011-05-18
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多