Mam następujący kod
SELECT tA.FieldName As [Field Name],
COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
U.UserName AS [User Name],
CONVERT(varchar, tA.ChangeDate) AS [Change Date]
FROM D tA
JOIN
[DRTS].[dbo].[User] U
ON tA.UserID = U.UserID
LEFT JOIN
A tO_A
on tA.FieldName = 'AID'
AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
LEFT JOIN
A tN_A
on tA.FieldName = 'AID'
AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
LEFT JOIN
B tO_B
on tA.FieldName = 'BID'
AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
LEFT JOIN
B tN_B
on tA.FieldName = 'BID'
AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
LEFT JOIN
C tO_C
on tA.FieldName = 'CID'
AND tA.oldValue = tO_C.Name
LEFT JOIN
C tN_C
on tA.FieldName = 'CID'
AND tA.newValue = tN_C.Name
WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate
Podczas uruchamiania kodu błąd jest wklejany w tytule po dodaniu dwóch złączeń dla tabeli C. Myślę, że może to mieć coś wspólnego z faktem, że korzystam z programu SQL Server 2008 i przywróciłem kopię tej bazy danych na moja maszyna, która jest rok 2005.
źródło
Wykonuję następujące czynności:
Działa za każdym razem. :)
źródło
Użyj
collate
klauzuli w swoim zapytaniu:Może nie mam poprawnej składni (sprawdź BOL), ale możesz to zrobić, aby zmienić sortowanie w locie dla zapytania - może być konieczne dodanie klauzuli dla każdego sprzężenia.
edycja: Zdałem sobie sprawę, że to nie do końca było właściwe - klauzula sortowania idzie za polem, które należy zmienić - w tym przykładzie zmieniłem sortowanie w
tA.oldValue
polu.źródło
Zidentyfikuj pola, dla których generuje ten błąd, i dodaj do nich następujące: COLLATE DATABASE_DEFAULT
Istnieją dwie tabele połączone w polu Kod:
Zaktualizuj zapytanie do:
źródło
Może się to łatwo zdarzyć, gdy masz 2 różne bazy danych, a zwłaszcza 2 różne bazy danych z 2 różnych serwerów. Najlepszą opcją jest zmiana na wspólną kolekcję i wykonanie połączenia lub porównania.
źródło
@Valkyrie niesamowita odpowiedź. Pomyślałem, że włożyłem tu przypadek, gdy wykonuję to samo z podzapytaniem, to procedura przechowywana, ponieważ zastanawiałem się, czy twoja odpowiedź działa w tym przypadku, i zrobiła się niesamowicie.
źródło
W miejscu, w którym dodawane są kryteria
collate SQL_Latin1_General_CP1_CI_AS
To działa dla mnie.
źródło
Główną przyczyną jest to, że baza danych serwera SQL, z której wzięto schemat, zawiera sortowanie różniące się od instalacji lokalnej. Jeśli nie chcesz się martwić o sortowanie, zainstaluj ponownie program SQL Server lokalnie, używając tego samego sortowania, co baza danych SQL Server 2008.
źródło
błąd (nie można rozwiązać konfliktu sortowania między ....) zwykle występuje podczas porównywania danych z wielu baz danych.
ponieważ nie możesz teraz zmienić sortowania baz danych, użyj COLLATE DATABASE_DEFAULT.
źródło
Miałem już coś takiego i stwierdziliśmy, że zestawienie między 2 tabelami było inne.
Sprawdź, czy są takie same.
źródło
Dzięki odpowiedzi marc_s rozwiązałem swój pierwotny problem - zainspirowany, aby pójść o krok dalej i opublikować jedno podejście do transformacji całej tabeli jednocześnie - skrypt tsql do generowania instrukcji alter column:
dostaje: ALTER TABELA Podmiot stowarzyszony ALTER COLUMN myTable NVARCHAR (4000) COLLATE Latin1_General_CI_AS NOT NULL
Przyznaję, że jestem zaskoczony potrzebą col.max_length / 2 -
źródło
Dla tych, którzy mają skrypt CREATE DATABASE (jak w moim przypadku) dla bazy danych, która powoduje ten problem, możesz użyć następującego skryptu CREATE, aby dopasować zestawienie:
lub
Odnosi się to do pożądanego sortowania do wszystkich tabel, a tego właśnie potrzebowałem. Idealne jest, aby spróbować utrzymać to samo sortowanie dla wszystkich baz danych na serwerze. Mam nadzieję że to pomoże.
Więcej informacji na następujący link: SQL SERVER - Tworzenie bazy danych z innym sortowaniem na serwerze
źródło
Użyłem treści z tej strony, aby utworzyć następujący skrypt, który zmienia sortowanie wszystkich kolumn we wszystkich tabelach:
źródło
Sprawdź poziom niedopasowanego sortowania (serwer, baza danych, tabela, kolumna, znak).
Jeśli to serwer, te kroki pomogły mi raz:
Uruchom to polecenie:
sqlservr -m -T4022 -T3659 -s"name_of_insance" -q "name_of_collation"
Uruchom serwer SQL:
net start name_of_instance
Sprawdź ponownie sortowanie swojego serwera.
Oto więcej informacji:
https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/
źródło
Jeśli występuje to w całej bazie danych, lepiej zmienić sortowanie bazy danych w następujący sposób:
Odnośnik tutaj
źródło
Dodano kod do odpowiedzi @ JustSteve, aby radzić sobie z kolumnami varchar i varchar (MAX):
źródło
Aby rozwiązać ten problem w zapytaniu bez zmiany bazy danych, możesz rzutować wyrażenia po drugiej stronie znaku „=” za pomocą
jak sugerowano tutaj .
źródło
Miałem podobny błąd (nie mogę rozwiązać konfliktu sortowania między „SQL_Latin1_General_CP1_CI_AS” i „SQL_Latin1_General_CP1250_CI_AS” w operacji INTERSECT), kiedy użyłem starego sterownika jdbc.
Rozwiązałem to, pobierając nowy sterownik z Microsoft lub projektu open source jTDS .
źródło
oto co zrobiliśmy, w naszej sytuacji potrzebujemy wykonania zapytania ad hoc z użyciem ograniczenia daty na żądanie, a zapytanie jest zdefiniowane w tabeli.
Nasze nowe zapytanie musi dopasowywać dane między różnymi bazami danych i obejmować dane z obu z nich.
Wygląda na to, że COLLATION różni się między db, który importuje dane z systemu iSeries / AS400, a naszą bazą danych raportowania - może to wynikać z określonych typów danych (takich jak greckie akcenty na imiona i tak dalej).
Dlatego użyliśmy poniższej klauzuli łączenia:
źródło
Możesz to łatwo zrobić za pomocą 4 prostych kroków
źródło
źródło
Możesz nie mieć żadnych problemów z sortowaniem w bazie danych, ale jeśli przywróciłeś kopię bazy danych z kopii zapasowej na serwerze z innym zestawieniem niż pochodzenie, a Twój kod tworzy tabele tymczasowe, te tabele tymczasowe odziedziczą sortowanie od serwer i wystąpiłyby konflikty z bazą danych.
źródło
źródło
Miałem podobny wymóg; dokumentując moje podejście tutaj dla każdego z podobnym scenariuszem ...
Scenariusz
Rozwiązanie
Użyj porównania schematów programu SQL Server (z SQL Server Data Tools / Visual Studio), aby porównać źródło (czysta instalacja) z miejscem docelowym (db z niepoprawnym zestawieniem).
W moim przypadku bezpośrednio porównałem dwa DB; chociaż możesz pracować za pośrednictwem projektu, aby umożliwić ręczne dostosowywanie elementów między ...
Object Types
wybierz tylko te typy, które Cię interesują (dla mnie było to tylkoViews
iTables
)General
wybierz:DELETE
folder prawym przyciskiem myszy i wybierającEXCLUDE
.CREATE
obiektów (tutaj, ponieważ nie istnieją one w celu, nie mogą mieć tam niewłaściwego zestawienia; pytanie, czy powinny istnieć, jest pytaniem na inny temat).Update
aby wprowadzić zmianyWciąż wymaga to trochę wysiłku ręcznego (np. Sprawdzenie, czy wpływasz tylko na sortowanie) - ale radzi sobie z zależnościami.
Możesz także zachować projekt bazy danych prawidłowego schematu, aby móc użyć uniwersalnego szablonu dla swoich baz danych, jeśli masz więcej niż 1 do aktualizacji, zakładając, że wszystkie docelowe bazy danych powinny mieć ten sam schemat.
Możesz także użyć funkcji znajdź / zamień na plikach w projekcie bazy danych, jeśli chcesz tam masowo zmienić ustawienia (np. Aby utworzyć projekt z nieprawidłowej bazy danych za pomocą porównania schematów, zmienić pliki projektu, a następnie przełączyć źródło / cel w porównanie schematu w celu wypchnięcia zmian z powrotem do DB).
źródło