2009-09-10 88 views
9

我有一個值在數據庫中的常數比較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. 

我該如何解決這個問題? (未做更改數據庫)

更新:我得到的,即使我刪除最後一個喜歡(字符串比較)這個錯誤...

回答

13

看來你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

5

指定的臨時表的聲明中的排序規則。

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

+1但是OP誤診了這個問題。問題欄是id,不是關鍵。我已經調整了你的答案以反映這種情況。 – 2012-07-20 20:13:26

2

問題是臨時表。它使用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://stackoverflow.com/a/1404916/224704)。 – 2012-07-20 20:03:52

0

嘗試

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