我正在处理一个 View ,其中我在来自两个不同服务器的两个表上使用内部联接。我们正在使用链接服务器。运行查询时,我收到此消息:
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Arabic_CI_AS" in the equal to operation.
我不太了解排序规则。通过互联网搜索我找到了使用 COLLATE
的解决方案,但我不清楚 COLLATE
的概念。它会改变任何数据库吗?我正在寻找一种不改变数据库任何内容的解决方案。
欢迎提供有关这些概念的任何好的学习 Material 。
最佳答案
您可以通过将查询中使用的排序规则强制为特定排序规则来解决问题,例如SQL_Latin1_General_CP1_CI_AS
或 DATABASE_DEFAULT
。例如:
SELECT MyColumn
FROM FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS =
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS
在上面的查询中,a.MyID 和 b.YourID 将是具有基于文本的数据类型的列。使用 COLLATE
将强制查询忽略数据库上的默认排序规则,而是使用提供的排序规则,在本例中为 SQL_Latin1_General_CP1_CI_AS
。
基本上这里发生的事情是每个数据库都有自己的排序规则,它“为您的数据提供排序规则、大小写和重音敏感度属性”(来自 http://technet.microsoft.com/en-us/library/ms143726.aspx)并应用于具有文本数据类型的列,例如VARCHAR
、CHAR
、NVARCHAR
等。当两个数据库具有不同的排序规则时,您无法使用等号 (=) 等运算符来比较文本列解决两种不同排序规则之间的冲突。
关于sql-server - 如何修复 SQL Server 查询中的排序规则冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544392/