sql-server - 如何修复 SQL Server 查询中的排序规则冲突?

标签 sql-server database collation

我正在处理一个 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_ASDATABASE_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)并应用于具有文本数据类型的列,例如VARCHARCHARNVARCHAR 等。当两个数据库具有不同的排序规则时,您无法使用等号 (=) 等运算符来比较文本列解决两种不同排序规则之间的冲突。

关于sql-server - 如何修复 SQL Server 查询中的排序规则冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544392/

相关文章:

c# - Entity Framework 批量插入/更新关系

c# - Guid.NewGuid() 在 Parallel.For 循环中使用时返回重复值

c# - SMO 编写整个数据库的脚本,就像 Studio Management 使用 Generate Scripts 所做的那样

sql-server - 标准化平均值的 T-SQL

ruby - 如何合并 Heroku 上具有相同架构的两个数据库?

sql - 数据库sql替换语句更新记录

sql - 成功插入后@@Error 可以为非零吗?

mysql比较curtime()和utf8中的一个常量

php - 为什么我的 html 不显示从我的数据库中获取的特殊字符

sql-server - 解析 xml 时整理