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'
指定的临时表的声明中的排序规则。
CREATE TABLE #TempTable (ID NVARCHAR(255) COLLATE database_default)
+1但是OP误诊了这个问题。问题栏是id,不是关键。我已经调整了你的答案以反映这种情况。 – 2012-07-20 20:13:26
问题是临时表。它使用tempdb的排序规则。
您可以在您的实际数据库中创建一个表,而不是临时表,然后他们将具有相同的排序规则。或者在创建临时表时指定排序规则。
不是真的 - 取决于临时表的创建方式,它将采用您所在的数据库的排序规则,或者tempdb的排序规则 - 而不是master。 如果临时表被显式创建(CREATE TABLE #temp),那么它将从tempdb获取排序规则。 如果表是从另一个表派生的(SELECT * INTO #temp from mytable),那么它会从源表中获取排序规则。 – 2009-09-10 12:34:08
好点...因为它们是在同一时间创建的,我*错误*通常查看master的排序规则以查找tempdb的排序规则。编辑合并正确的答案。 Ta :) – 2009-09-10 12:42:11
通过在实际数据库中创建“常规临时”表来解决不好的解决方法。有两种技术可以确保临时表使用兼容排序规则: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'
谢谢,我说好的注意到我的ID是字符。 – Justin 2009-09-10 12:23:53
真棒帮我掐了一下。令人惊讶的是,我在两张临时表之间得到了这个结果,但是这种方法解决了这个问题。 – 2014-04-03 15:58:28