2009-09-10 35 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. 

どうすればこの問題を回避できますか?

UPDATE(データベースに変更を加えることなく):私は

答えて

13

は、あなたのid年代が異なる照合順序を持つVARCHARのあるようだ...私は(文字列比較)のような最後を削除する場合でも、このエラーが発生します。あなたの一時テーブルの宣言内部の照合を指定し

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の文字だったことに気づいたhadnt。 – Justin

+0

大変お手伝いしました。驚いたことに、これを2つの一時テーブルの間に入れましたが、いずれの方法でもこの問題を解決することができました。 –

5

はこれを試してみてください。

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

+1しかしOPは問題を誤診しました。問題の列はキーではなくidです。私はそのように反映するために答えを調整しました。 –

2

問題は一時表です。 tempdbの照合を使用します。

テンポラリテーブルではなく、実際のデータベースにテーブルを作成して、同じ照合順序を作成することができます。または、テンポラリテーブルの作成時に照合順序を指定します。

+2

真ではありません - 一時テーブルの作成方法によっては、使用しているデータベースの照合、またはmasterではなくtempdbの照合が行われます。 一時テーブルが明示的に作成されている場合(CREATE TABLE #temp)、tempdbから照合が行われます。 テーブルが別のテーブル(SELECT * INTO #temp from mytable)から派生している場合、ソーステーブルからの照合が行われます。 –

+0

良い点...それらは同時に作成されるので間違いなく*通常はtempdbの照合を見つけるためにマスターの照合を見ます。正しい答えを組み込むように編集されました。 Ta :) –

+0

あなたの実際のデータベースに「通常の一時的な」テーブルを作成することで、回避策へのアドバイスが悪いです。テンポラリテーブルで互換性のある照合が使用されるようにするには、2つの方法があります。Kev Rileyが1つを与えます(http://stackoverflow.com/a/1404916/224704)。 –

0

SELECT * FROM my_table 
INNER JOIN #TempTable temp  
    ON my_table.id = temp.id collate database_default 
    AND my_table.key = 'SOME STRING' 
関連する問題