在同一 SQL.Server 上跨 2 个数据库加入时的 COLLATE 问题

Posted

技术标签:

【中文标题】在同一 SQL.Server 上跨 2 个数据库加入时的 COLLATE 问题【英文标题】:COLLATE issue on joining across 2 database on same SQL.Server 【发布时间】:2015-10-19 15:16:52 【问题描述】:

我不断收到此错误:

无法解决“Latin1_General_BIN”之间的排序规则冲突 和“SQL_Latin1_General_CP1_CI_AS”中的等于操作。

我不知道如何解决它。

我通过加入在两个数据库中具有不同名称的列来跨同一服务器上的两个不同数据库加入。

SELECT t1.ColumnNameDB1, t2.ColumnNameDB2
FROM DB1.schema.TableName AS t1
INNER JOIN DB2.schema.TableName as t2
ON t1.ColumnNameDB1 =  t2.ColumnNameDB2

我正在努力找出自己做错了什么。

【问题讨论】:

【参考方案1】:

您可以尝试在连接级别明确指定排序规则。

SELECT t1.ColumnNameDB1, t2.ColumnNameDB2
FROM DB1.schema.TableName AS t1
INNER JOIN DB2.schema.TableName as t2
ON t1.ColumnNameDB1 =  LTRIM(RTRIM(t2.ColumnNameDB2)) COLLATE SQL_Latin1_General_CP1_CI_AS 

【讨论】:

您能否向我解释一下整理以及 LTRIM 和 RTRIM 命令的含义 当然,SQL Sever 中的排序规则定义了您如何排序和比较字符串值。它定义了如何处理不同的重音、区分大小写、上下文、ASCII 排序或 UNICODE。对于上述特定排序规则,其含义如下:***.com/a/5039321/1821329。此外,RTRIM 和 LTRIM 函数用于删除字符串值中的任何尾随和前导空格。例如假设您的字段有一个值 = `Test` 在这种情况下,LTRIM 将删除前导空格,而 RTRIM 将删除尾随空格,这反过来应该给出一个值 = Test。希望有帮助! :) 我可以使用其他版本或一组整理规范吗? 当然,这完全取决于您的需求。以下是您可以选择的不同类型的排序规则:technet.microsoft.com/en-US/library/ms144250(v=sql.105).aspx【参考方案2】:

使用这个:

SELECT t1.ColumnNameDB1,
 t2.ColumnNameDB2 FROM
 DB1.schema.TableName AS t1 INNER JOIN
 DB2.schema.TableName as t2 ON
 t1.ColumnNameDB1 Collate database_default =
 t2.ColumnNameDB2 collate database_default

【讨论】:

以上是关于在同一 SQL.Server 上跨 2 个数据库加入时的 COLLATE 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一台服务器上跨多个域维护 PHP 会话?

SQL Server CE:到同一个数据库(C#,WPF)的多个连接(2+ 应用程序)

SQL Server Alwayson配置两个节点加共享文件夹仲裁见证

sql server 2012复制数据库在同一主机上的两个实例之间失败

SQL Server中存储过程的创建命令

SQL Server专家的10个秘诀(翻译加注解)