与临时表中的列进行比较时发生 SQL 排序规则冲突

Posted

技术标签:

【中文标题】与临时表中的列进行比较时发生 SQL 排序规则冲突【英文标题】:SQL Collation conflict when comparing to a column in a temp table 【发布时间】:2010-11-27 03:41:36 【问题描述】:

我有一个 SQL 查询,它将数据库中的一个值与一个常量进行比较:

SELECT * FROM my_table
INNER JOIN #TempTable tem
    ON my_table.id = temp.id
    AND my_table.key = 'SOME STRING'

我得到了错误:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

我该如何解决这个问题? (不更改数据库)

更新:即使我删除了最后一个类似(字符串比较),我也会收到此错误...

【问题讨论】:

【参考方案1】:

您的 id 似乎是 VARCHARs 具有不同的排序规则。

试试这个:

SELECT  *
FROM    my_table
INNER JOIN
        #TempTable tem
ON      my_table.id = temp.id COLLATE SQL_Latin1_General_CP1_CI_AS
        AND my_table.key = 'SOME STRING'

【讨论】:

谢谢,我没有注意到我的 id 是字符。 真棒帮助了我。令人惊讶的是,我在两个临时表之间得到了这个,但无论哪种方式都可以解决问题。【参考方案2】:

在临时表的声明中指定排序规则。

CREATE TABLE #TempTable (ID NVARCHAR(255) COLLATE database_default)

【讨论】:

+1 但是 OP 误诊了问题。问题列是 id,而不是键。我已调整您的答案以反映这一点。【参考方案3】:

问题是临时表。它使用 tempdb 的排序规则。

您可以在您的实际数据库中创建一个表而不是临时表,然后它们将具有相同的排序规则。或者在创建临时表时指定排序规则。

【讨论】:

不正确 - 根据临时表的创建方式,它会采用您所在数据库的排序规则,或者 tempdb 的排序规则 - 不是主表。如果临时表是显式创建的(CREATE TABLE #temp),那么它会从 tempdb 中获取排序规则。如果该表是从另一个表派生的(SELECT * INTO #temp from mytable),那么它会从源表中获取排序规则。 好点......因为它们是同时创建的,我错误地通常查看 master 的排序规则以找到 tempdb 的排序规则。编辑以纳入正确答案。塔:) 通过在您的实际数据库中创建一个“正常临时”表来解决问题的坏建议。有两种技术可以确保临时表使用兼容的排序规则:Kev Riley 提供一种,(***.com/a/1404916/224704) 提供另一种。【参考方案4】:

试试

SELECT * FROM my_table
INNER JOIN #TempTable temp    
    ON my_table.id = temp.id collate database_default
    AND my_table.key = 'SOME STRING'

【讨论】:

以上是关于与临时表中的列进行比较时发生 SQL 排序规则冲突的主要内容,如果未能解决你的问题,请参考以下文章

sql server排序规则冲突

集合List根据多个字段进行排序

在 SQL 中排序时如何比较同一表中的两行?

SQL Server:尽管进行了转换,但无法解决排序规则冲突

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

如何在 SQL 中更改存储过程的排序规则?