在同一 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 问题的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server CE:到同一个数据库(C#,WPF)的多个连接(2+ 应用程序)
SQL Server Alwayson配置两个节点加共享文件夹仲裁见证