2013-12-12 6 views
24

Pracuję nad widokiem, w którym używam wewnętrznego sprzężenia na dwóch tabelach, które pochodzą z dwóch różnych serwerów. Używamy serwera połączonego. Podczas uruchamiania kwerendy otrzymuję następujący komunikat:Jak pozbyć się konfliktu sortowania w zapytaniu serwera SQL?

Nie można rozwiązać konfliktu sortowania między "SQL_Latin1_General_CP1_CI_AS" a "Arabic_CI_AS" w równej operacji.

Nie wiem zbyt wiele na temat zestawiania. Przeszukując przez Internet, znajduję rozwiązania, które można zastosować pod COLLATE, ale pojęcie COLLATE nie jest dla mnie jasne. Czy zmieni ona cokolwiek dla żadnej z baz danych? Szukam rozwiązania, nie zmieniając niczego dla baz danych.

Każdy dobry materiał do nauki dla tych koncepcji jest mile widziany.

+0

Czy możesz pokazać kod SQL, nad którym pracujesz? –

Odpowiedz

37

Problem możesz rozwiązać, wymuszając sortowanie używane w zapytaniu jako konkretne sortowanie, np. SQL_Latin1_General_CP1_CI_AS lub DATABASE_DEFAULT. Na przykład:

SELECT MyColumn 
FROM FirstTable a 
INNER JOIN SecondTable b 
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS = 
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS 

W powyższym zapytaniu a.MyID i b.YourID byłoby kolumny z typem danych tekstowych. Użycie COLLATE zmusi zapytanie do zignorowania domyślnego sortowania w bazie danych i zamiast tego skorzysta z dostarczonego sortowania, w tym przypadku SQL_Latin1_General_CP1_CI_AS.

zasadzie to, co się tutaj dzieje jest to, że każda baza danych ma swój własny sortowania, która „określa zasady sortowania, przypadku i właściwości czułości akcent na dane” (z http://technet.microsoft.com/en-us/library/ms143726.aspx) i odnosi się do kolumn o typach danych tekstowych, na przykład VARCHAR, , NVARCHAR itd. Gdy dwie bazy danych różnią się sortowaniem, nie można porównywać kolumn tekstowych z operatorem takim jak equals (=) bez rozwiązywania konfliktu między dwoma odmiennymi sortowaniami.

+0

Dziękuję Roryap. Aktualizuję swój kod za pomocą COLLATE. Dam ci znać, jeśli masz jakiś problem. Oznacza to, że nic nie zostanie zmienione na poziomie bazy danych, a ta funkcja COLLATE zostanie wykonana tylko w skrypcie SQL. – elmo

+0

Dzięki, udało się. Mój problem został rozwiązany. – elmo

+0

Co ciekawe, do tej pory myślałem, że muszę zmienić sortowanie na poziomie bazy danych, aby dopasować em, nie wiedziałem, że mogę dopasować em w moim zapytaniu używając 'COLLATE'! dziękuję to zaoszczędziło mi wiele kłopotów. – Niklas

3

postanowiłem podobny problem owijając zapytanie w innym zapytaniu ...

zapytania początkowe pracowała znaleźć dając poszczególne kolumny wyjścia, niektóre z kolumn pochodzących z sub zapytań z max lub funkcji Sum i inne z "różnymi" lub podstawami przypadku i tym podobne.

I napotkał błąd sortowania po próbie utworzenia jednego pola wyjściu z ...

select 
rtrim(field1)+','+rtrim(field2)+','+... 

Zapytanie by wykonać jak to pisałem, ale błąd będzie występować po zapisaniu go sql i przeładunku .

Gojenie się go naprawić coś jak ...

select z.field1+','+z.field2+','+... as OUTPUT_REC 
from (select rtrim(field1), rtrim(field2), ...) z 

Niektóre pola są „max” z podzapytania, w przypadku zastąpienia, jeśli nieważne i inni są pola daty, a niektóre pozostają sprzężeń (potęga be NULL) ... innymi słowy, mieszane typy pól. Uważam, że jest to przyczyna problemu spowodowanego przez sortowanie OS i porównywanie baz danych nieco się różni, ale poprzez konwersję wszystkich do przyciętych łańcuchów przed ostatecznym wyborem, sortuje to wszystko w SQL.

Powiązane problemy