2009-09-10 13 views
9

Mam kwerendy SQL, który porównuje wartość w bazie danych do stałej:SQL Sortowanie konflikt przy porównywaniu do kolumny w tabeli temp

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

I pojawia się błąd:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation. 

Jak mogę to obejść? (Bez dokonywania zmian w bazie danych)

UPDATE: I ten błąd nawet jeśli usunąć ostatni (jak porównania string) ...

Odpowiedz

13

Wydaje się swoimi id „s są VARCHAR ów z różnych sortowania.

Spróbuj tego:

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

Dzięki, ja nigdzie nie zauważyłem, że mój identyfikator użytkownika były znaków. – Justin

+0

Awesome pomógł mi w szczypie. Zaskakująco dostałem to między dwoma tabelami tymczasowymi, ale tak czy inaczej to działało, aby rozwiązać problem. –

5

Określ sortowania wewnątrz deklaracji tabeli temp.

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

+1 Ale OP błędnie zdiagnozował problem. Kolumna problemu była identyfikatorem, a nie kluczem. Poprawiłem twoją odpowiedź, by ją odzwierciedlać. –

2

Problem dotyczy tabeli tymczasowej. Używa zestawienia tempdb.

Można utworzyć tabelę w rzeczywistej bazie danych, a nie w tabeli tymczasowej, a następnie będą one miały takie same sortowanie. Lub określ sortowanie po utworzeniu tabeli tymczasowej.

+2

Nieprawdziwe - w zależności od tego, w jaki sposób utworzono tabelę tymczasową, wystarczyłoby sortowanie bazy danych, w której się znajdujesz, lub sortowanie tempdb - nie wzorca. Jeśli tabela tymczasowa jest jawnie utworzona (CREATE TABLE #temp), to pobiera sortowanie z tempdb. Jeśli tabela jest wyprowadzona z innej tabeli (SELECT * INTO #temp from mytable), to pobiera sortowanie z tabeli źródłowej. –

+0

Dobra uwaga ... ponieważ są one tworzone w tym samym czasie, ja * błędnie * zazwyczaj patrzę na układanie wzorca, aby znaleźć zestawienie tempdb. zredagowane w celu włączenia poprawnej odpowiedzi. Ta :) –

+0

Zła rada do obejścia, tworząc tabelę "normalnie-tymczasową" w rzeczywistej bazie danych. Istnieją dwie techniki, które zapewniają, że tabela tymczasowa używa kompatybilnego zestawienia: Kev Riley daje jeden, (http://stackoverflow.com/a/1404916/224704) ma drugi. –

0

spróbować

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