【问题标题】:SQL Collation conflict when comparing to a column in a temp table与临时表中的列进行比较时发生 SQL 排序规则冲突
【发布时间】: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.

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

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

【问题讨论】:

    标签: sql collation


    【解决方案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 提供一种,(stackoverflow.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'
    

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2012-01-21
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多