与临时表中的列进行比较时发生 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
似乎是 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'
【讨论】:
谢谢,我没有注意到我的 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 排序规则冲突的主要内容,如果未能解决你的问题,请参考以下文章