Jak zmienić sortowanie programu SQL Server

27

Jak mogę zmienić domyślne sortowanie SQL Server 2008 R2 Express dla całego serwera i konkretnej bazy danych?

Czy można to zrobić za pomocą interfejsu wizualnego SQL Server Management Studio? W oknie Właściwości serwera (oraz w odpowiednim oknie Właściwości bazy danych) ta właściwość nie jest dostępna do edycji.

rem
źródło
2
Jeśli chcesz zmienić układ wszystkich kolumn w bazie danych, spójrz na ten skrypt . Sam tego nie próbowałem, ale znalazłem to dla współpracownika, który właśnie tego chciał.
Justin Dearing
2
Jeśli chcesz zmienić sortowanie bazy danych, sprawdź to narzędzie: codeproject.com/KB/database/ChangeCollation.aspx Działa z SQL Server 2005 i 2008 i działa lepiej dla mnie niż skrypty, które możesz znaleźć na sieć.
Erwin

Odpowiedzi:

25

Tak.

Możesz zmienić domyślne sortowanie instancji ekspresowej SQL Server 2008 R2 i poszczególnych baz danych, ale jest to złożone zadanie.

Niestety nie ma opcji wizualnej, aby to zrobić za pośrednictwem SSMS.

SQL Server 2008 obsługuje ustawianie sortowania na następujących poziomach:

  • serwer

  • Baza danych

  • Kolumna

  • Wyrażenie

Domyślne ustawienia instalacji są określone przez ustawienia regionalne systemu Windows. Sortowanie na poziomie serwera można zmienić podczas instalacji lub przez zmianę ustawień regionalnych systemu Windows przed instalacją. więcej...

Ustawianie i zmiana sortowania serwerów - SQL Server 2008

  • Upewnij się, że masz wszystkie informacje lub skrypty potrzebne do odtworzenia baz danych użytkowników i wszystkich zawartych w nich obiektów.

  • Wyeksportuj wszystkie dane za pomocą narzędzia takiego jak Narzędzie bcp. Aby uzyskać więcej informacji, zobacz Importowanie i eksportowanie danych masowych.

  • Usuń wszystkie bazy danych użytkowników.

  • Odbuduj główną bazę danych, podając nowe sortowanie we właściwości SQLCOLLATION polecenia setup

  • Utwórz wszystkie bazy danych i wszystkie zawarte w nich obiekty.

  • Zaimportuj wszystkie swoje dane.

Ustawianie i zmiana sortowania bazy danych - SQL Server 2008

  • Ustaw COLLATIONopcję w CREATE DATABASEinstrukcji podczas tworzenia nowej bazy danych.
  • Podobnie ustaw COLLATIONopcje w ALTER DATABASEinstrukcji, aby zmienić sortowanie istniejącej bazy danych.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Ustawianie i zmiana sortowania kolumn

  • Niektóre sortowania kolumn pozostaną takie same, nawet po zmianie sortowania bazy danych. W takim przypadku musisz zmodyfikować zestawienie poszczególnych kolumn.
CoderHawk
źródło
6

Upewnij się, że naprawdę chcesz „upuścić” bazy danych użytkowników, jak wspomniano w odpowiedzi powyżej. Możesz po prostu „odłączyć” bazy danych. A tak naprawdę, nie możesz nic zrobić, ponieważ przebudowanie mastera skutecznie usuwa wszelkie linki do baz danych użytkowników. Są chwile, kiedy bazy danych są tworzone w pożądanym sortowaniu, ale serwer nie. W takim przypadku nie trzeba odzyskiwać wszystkich baz danych użytkowników z kopii zapasowych.

AndrewSQL
źródło
5

Zrobiłem coś takiego i zadziałało, ale musisz pamiętać o indeksach wskazujących na typ danych, ponieważ tekst / varchar / nvarchar musi zostać usunięty, uruchom skrypt, a następnie utwórz indeksy.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

to jest moja pierwsza odpowiedź, ułaskaw mój bałagan

Jeffry
źródło
-1

Eksportu wszystkich danych (w tym loginów, połączonych serwerów, praca agenta SQL DB, ustawień poczty itp), a odbudowa danych na poziomie instancji, a także przeładunek wszystkich danych użytkownika, jest dużo pracy. I nawet po tym wszystkim, że nadal nie ma gwarancji, że można zaktualizować domyślnego sortowania danej bazie danych za pośrednictwem ALTER DATABASE, ponieważ istnieje kilka warunków, które uniemożliwiają działanie ukończenie (proszę zobaczyć „Zmiana bazy danych z sortowaniem” sekcję ALTER DATABASEdokumentacji o szczegóły) .

Istnieje jednak nieudokumentowana metoda, która jest znacznie łatwiejsza. Główną wadą jest to, że nie jest obsługiwany. Nie oznacza to, że coś pójdzie nie tak, tylko że jeśli coś zrobi, Microsoft nie pomoże to naprawić (ponieważ nigdy nie gwarantowali, że to zadziała).

Metoda, o której mówię, polega na sqlservr.exeużyciu -q {new_collation_name}przełącznika. Jest w tym trochę więcej, ale to jest podstawowa idea. Ta metoda po prostu aktualizuje metadane systemowe, co ma zalety i konsekwencje, a głównymi z nich są:

KORZYŚCI

  • całkiem szybko
  • ominąć większość ograniczeń, które uniemożliwiają ALTER DATABASEdziałanie
  • prawdopodobnie znacznie dokładniejsze niż jakikolwiek skrypt, który ludzie wymyślili przez lata, aby upuszczać i odtwarzać obiekty

ZWROTY

  • nieobsługiwane, jeśli coś pójdzie nie tak
  • VARCHARdane mogą ulec zmianie, JEŚLI strona kodowa różni się między starymi i nowymi zestawieniami, a istnieją znaki o wartości 128 - 255 (0x80 - 0xFF), a te znaki nie istnieją jako ten sam znak o tej samej wartości w nowym kodzie strona. Istnieje zatem ryzyko utraty danych, a dane muszą najpierw zostać zbadane, aby upewnić się, że ten warunek nie istnieje. Ale oznacza to również, że istnieje wiele przypadków, w których tylko znaki mają wartości 0–127, które nie są w żadnym niebezpieczeństwie, nawet jeśli strona kodowa ulegnie zmianie.
  • Typy tabel zdefiniowane przez użytkownika (UDTT) są pomijane i wymagają ręcznej aktualizacji.

Szczegółowy opis tego, co sqlservr.exe -qrobi metoda, a czego nie robi (w tym szczegółowe informacje na temat sortowania na różnych poziomach oraz potencjalne problemy, na które należy uważać), zobacz mój post:

Zmienianie sortowania instancji, baz danych i wszystkich kolumn we wszystkich bazach danych użytkowników: co może być nie tak?

Aby zmienić tylko instancji (w tym baz danych systemowych: master, model, msdb, i tempdb) oraz jeden lub więcej baz danych (ale nie wszystkie bazy danych), po prostu odłączyć bazę (y), które chcesz wykluczyć z tej operacji, a następnie ponownie je załączyć po zakończeniu aktualizacji sortowania.

Solomon Rutzky
źródło