Mam tabelę Companies z wielojęzyczną kolumną CompanyName (zdefiniowaną jako nvarchar (512)).Sortowanie kolumny przed różnymi sortowaniami w SQL Server
Mam również procedurę przechowywaną do przeszukiwania i zwracania listy firm, wymaga ona dwóch parametrów nvarchar - jeden jest terminem wyszukiwania, a drugi jest kodem języka ISO.
Co chciałbym być w stanie zrobić, to wrócić wyniki wyszukiwania posortowane z zestawień odpowiedniej dla kodu języka dostarczonym w drugim parametrem, na przykład:
SELECT * FROM dbo.Companies WHERE CompanyName LIKE '%searchstring%'
ORDER BY
CASE @lang
WHEN 'sv' THEN CompanyName COLLATE Sami_Sweden_Finland_100_CI_AI
WHEN 'ch' THEN CompanyName COLLATE Chinese_Simplified_Pinyin_100_CI_AI
ELSE CompanyName
END
jednak pojawia się następujący błąd przy próbie uruchomienia go:
nie można rozwiązać konflikt sortowania między „Chinese_Simplified_Pinyin_100_CI_AI” i „Sami_Sweden_Finland_100_CI_AI” w t operacja CASE.
To nie ma dla mnie żadnego sensu - to nie jest tak, że sortuję w kolekcjach, dlaczego wystąpiłby konflikt kolacjonowania? Jest to wykluczający się wybór.
Próbowałem nie być zbyt sprytny i po prostu używać dynamicznego sql, niestety, wydaje się, że pozostawienie bazy danych nie jest w stanie buforować planu wykonania, dlatego czasy zapytania wynoszą ponad 20 sekund (w przeciwieństwie do 1), gdy tabela zawiera około 2 miliony wierszy.
Jestem pewien, że sortowanie wrażliwe na kulturę musi być powszechnym problemem, czy ktoś wie o dobrym rozwiązaniu, które nie wiąże się z modyfikacją obecnego schematu (np. Jak utworzyć dodatkowe kolumny)?
Dzięki temu neguje to potrzebę korzystania z dynamicznego SQL (chociaż wciąż nie rozumiem, dlaczego różne zestawienia w jednym przypadku CASE spowodowałyby konflikt - będzie to tylko jeden na sobie!). Problem polega na tym, że SQL nie wydaje się przechwytywać indeksów jako części planu wykonania. W powyższym przykładzie utworzyłem 2 kolumny obliczeniowe (indeksowane) odpowiednio w kolumnie NazwaFirmy, odpowiednio ze zbiorem szwedzkim i Pinyin, które są pobierane podczas wykonywania ZAMÓWIENIA PRZEZ FirmName z wyraźnym zestawieniem, ale nie w powyższym zapytaniu. Czy istnieje sposób jawnego wskazania SQL do korzystania z indeksów? –
@ Jonathan Hoult: niestety, nie. Indeks jest unieważniany przez klauzulę COLLATE, jak można się spodziewać. – gbn