Jak zmienić sortowanie bazy danych SQL Server?

16

Próbuję ujednolicić wszystkie bazy danych w jednym zestawieniu - Latin1_General_CI_AS (standardowe zestawienie). Mam kilka baz danych w SQL_Latin1_General_CP1_CI_AS.

Wiem, że mogę użyć ZMIEŃ bazę danych, aby zmienić sortowanie bazy danych, ale dotyczy to tylko nowych obiektów. Rozumiem, że jedynym sposobem na zmianę istniejących kolumn jest zrobienie ALTER COLUMN na każdej kolumnie w każdej tabeli - i musiałbym upuścić i odtworzyć wszystkie indeksy, aby to zrobić.

Myślę, że wyglądałoby to tak:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

i powtarzaj dla każdej kolumny varchar, char, text, nvarchar, nchar i ntext w całej bazie danych. To byłby ogromny skrypt SQL.

Czy istnieje prostszy sposób, aby to zrobić, czy ktoś może zasugerować sposób zautomatyzowania tworzenia skryptu SQL, aby to zrobić?

Richard Gadsden
źródło

Odpowiedzi:

9

MS KB 325335 ma opcje, jak to zrobić dla całej bazy danych i wszystkich kolumn.

Gruntownie:

  1. Tabele bazy danych skryptów (z nowym zestawieniem)
  2. Dane DTS / SSIS (oglądanie zestawień)
  3. Dodaj ograniczenia
gbn
źródło
2

Niestety nie jest to łatwe zadanie w SQL Server.

Możesz użyć narzędzia skryptowego, takiego jak Porównaj SQL Redgate dla istniejących obiektów bazy danych (tabele, procedury składowane, widoki itp.) Jeśli nie masz licencji, możesz skorzystać z bezpłatnej wersji próbnej. Po utworzeniu nowej bazy danych z odpowiednim zestawieniem i przebudowaniu obiektów ze skryptu możesz uruchomić SSIS, aby przesłać dane z jednej bazy danych do drugiej. Jeśli masz dużo danych, użyj wstawiania zbiorczego T-SQL.

Aby mieć odpowiednie sortowanie dla przyszłych baz danych na tym serwerze, możesz zmienić domyślne sortowanie na serwerze. W poniższym artykule MSDN wyjaśniono, jakie zmiany przy użyciu klauzul COLLATE w ALTER DATABASE i ALTER TABLE:

Ustawianie i zmiana sortowania bazy danych (SQL Server 2008 Books Online)

Możesz zmienić układanie dowolnych nowych obiektów, które są tworzone w bazie danych użytkowników, używając klauzuli COLLATE instrukcji ALTER DATABASE . Ta instrukcja nie zmienia sortowania kolumn w żadnych istniejących tabelach zdefiniowanych przez użytkownika. Można je zmienić za pomocą klauzuli COLLATE z ALTER TABLE .

Po zmianie sortowania bazy danych zmieniane są następujące elementy:

  • Domyślne sortowanie dla bazy danych. To nowe domyślne sortowanie jest stosowane do wszystkich kolumn, typów danych zdefiniowanych przez użytkownika, zmiennych i parametrów utworzonych następnie w bazie danych. Służy również do rozpoznawania identyfikatorów obiektów określonych w instrukcjach SQL względem obiektów zdefiniowanych w bazie danych.
  • Wszelkie kolumny char, varchar, text, nchar, nvarchar lub ntext w tabelach systemowych są zmieniane na nowe zestawienie.
  • Wszystkie istniejące parametry char, varchar, text, nchar, nvarchar lub ntext oraz wartości zwracane przez skalar dla procedur przechowywanych i funkcji zdefiniowanych przez użytkownika są zmieniane na nowe sortowanie.
  • Typy danych char, varchar, text, nchar, nvarchar lub ntext oraz wszystkie typy danych zdefiniowane przez użytkownika w oparciu o te systemowe typy danych są zmieniane na nowe domyślne sortowanie.
splattne
źródło
1

Zasadniczo nie zaleca się robienia tego na serwerze na żywo. Ostatnim razem, gdy patrzyłem, robienie tego nie było oficjalnie wspierane przez Microsoft. Aby to zrobić w praktyce, musisz utworzyć nową instancję z odpowiednim sortowaniem i migrować do niej bazę danych.

Przywrócenie bazy danych DB z serwerem z innym domyślnym zestawieniem powoduje różnego rodzaju zabawę, ponieważ tempdb będzie mieć zestawienie nowego serwera, więc nie jest to również zalecane.

ConcernedOfTunbridgeWells
źródło
1

Wypróbuj to narzędzie , które, biorąc pod uwagę źródłową bazę danych, wygeneruje wszystkie skrypty potrzebne do zastosowania w docelowej bazie danych, aby sortowanie zostało bezpiecznie zmienione.

Manea Florin
źródło
1

Możesz użyć widoków Infomation_Schema do dość łatwego wygenerowania skryptu, ale nie jestem pewien, czy jest to najlepszy sposób rozwiązania problemu. Ponowne utworzenie wszystkich indeksów na obszernej bazie danych może zająć ogromną ilość czasu / miejsca w dzienniku itp. Chciałbym migrować (nie przywracać) do nowej instancji.

Dave Jackson
źródło