SQL排序规则发生冲突时在临时表

SQL排序规则发生冲突时在临时表

问题描述:

我有一个值在数据库中的常数比较SQL查询: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. 

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

更新:我得到的,即使我删除最后一个喜欢(字符串比较)这个错误...

看来你id的是VARCHAR s的不同的排序规则。

试试这个:

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' 
+0

谢谢,我说好的注意到我的ID是字符。 – Justin 2009-09-10 12:23:53

+0

真棒帮我掐了一下。令人惊讶的是,我在两张临时表之间得到了这个结果,但是这种方法解决了这个问题。 – 2014-04-03 15:58:28

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

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

+1但是OP误诊了这个问题。问题栏是id,不是关键。我已经调整了你的答案以反映这种情况。 – 2012-07-20 20:13:26

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

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

+2

不是真的 - 取决于临时表的创建方式,它将采用您所在的数据库的排序规则,或者tempdb的排序规则 - 而不是master。 如果临时表被显式创建(CREATE TABLE #temp),那么它将从tempdb获取排序规则。 如果表是从另一个表派生的(SELECT * INTO #temp from mytable),那么它会从源表中获取排序规则。 – 2009-09-10 12:34:08

+0

好点...因为它们是在同一时间创建的,我*错误*通常查看master的排序规则以查找tempdb的排序规则。编辑合并正确的答案。 Ta :) – 2009-09-10 12:42:11

+0

通过在实际数据库中创建“常规临时”表来解决不好的解决方法。有两种技术可以确保临时表使用兼容排序规则:Kev Riley给出了另一种排序规则(http://*.com/a/1404916/224704)。 – 2012-07-20 20:03:52

尝试

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