无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突
Posted
技术标签:
【中文标题】无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突【英文标题】:Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operations 【发布时间】:2017-04-26 14:22:22 【问题描述】:这是我的 sql 查询
DELETE FROM [Prospects].[dbo].[P1]
WHERE RTRIM(LTRIM(DomainName)) IN
(SELECT RIGHT(UserEmail, LEN(UserEmail) - CHARINDEX('@', UserEmail)) UserEmail
FROM [Recruiter].[dbo].[tblSystemUser])
如何解决这个问题?
【问题讨论】:
看起来你需要在你的数据库设计上工作......一致的排序规则使用是诀窍! Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation的可能重复 【参考方案1】:你可以添加
COLLATE DATABASE_DEFAULT
到查询的末尾进行转换并修复错误,但这会影响性能。
正如 jarlh 所建议的,将数据库的排序规则更改为相同是实际的解决方法。
【讨论】:
更改数据库的排序规则 听起来很简单,但却是一个非常复杂的挑战。索引、约束、键都取决于此...如果您的服务器的默认设置不同,它可能会导致最严重的麻烦。此默认值是您的tempdb
中的默认值。当您使用 #table
并尝试加入 varchar 列时,这会出现神秘消息...
@Shnugo 虽然只是 SQL 与通用版本,但他的排序规则基本相同......所以不应该真正破坏任何东西......我建议他将非标准的排序规则更改为与服务器默认设置相同,这将解决比它可能产生的问题更多的问题。唯一的区别是轻微的排序顺序差异和 unicode 处理
我写的不是错误或更改的结果,而是之前完美运行的非运行代码。我曾经不得不更改数据库的排序规则,这真是让人头疼。在这之后突然一堆存储过程抛出错误(类似于无法解决排序规则冲突)。 ORDER BY
和 JOIN
对临时表中的字符串列进行操作的原因。过了一会儿我们又回到了原来的排序规则,这又是一件令人头疼的事情:-(【参考方案2】:
尝试将 COLLATE DATABASE_DEFAULT 添加到您的查询中:
DELETE FROM [Prospects].[dbo].[P1]
WHERE RTRIM(LTRIM(DomainName)) COLLATE DATABASE_DEFAULT IN
(SELECT RIGHT(UserEmail, LEN(UserEmail) - CHARINDEX('@', UserEmail)) COLLATE DATABASE_DEFAULT UserEmail
FROM [Recruiter].[dbo].[tblSystemUser])
【讨论】:
【参考方案3】:试试看
DELETE FROM [Prospects].[dbo].[P1]
WHERE RTRIM(LTRIM(DomainName)) COLLATE DATABASE_DEFAULT IN
(SELECT RIGHT(UserEmail, LEN(UserEmail) - CHARINDEX('@', UserEmail)) UserEmail
FROM [Recruiter].[dbo].[tblSystemUser
])
【讨论】:
以上是关于无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突的主要内容,如果未能解决你的问题,请参考以下文章
无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突[重复]
无法解决等于操作中“SQL_Latin1_General_Pref_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突