So ändern Sie die SQL Server-Sortierung

27

Wie kann ich die SQL Server 2008 R2 Express-Standardkollatierung für den gesamten Server und eine bestimmte Datenbank ändern?

Gibt es eine Möglichkeit, dies mithilfe der visuellen Oberfläche von SQL Server Management Studio zu tun? Im Fenster Servereigenschaften (und im entsprechenden Fenster Datenbankeigenschaften) kann diese Eigenschaft nicht bearbeitet werden.

rem
quelle
2
Wenn Sie die Sortierung aller Spalten in der Datenbank ändern möchten, sehen Sie sich dieses Skript an . Ich habe es nicht selbst ausprobiert, aber ich habe es für einen Kollegen gefunden, der genau das tun wollte.
Justin Dearing
2
Wenn Sie die Sortierung einer Datenbank ändern möchten, lesen Sie das folgende Tool: codeproject.com/KB/database/ChangeCollation.aspx Es funktioniert mit SQL Server 2005 und 2008 und hat für mich besser funktioniert als die Skripte, die Sie möglicherweise auf der finden Netz.
Erwin

Antworten:

25

Ja.

Sie können die Standardkollatierung der SQL Server 2008 R2-Expressinstanz und einzelner Datenbanken ändern, dies ist jedoch eine komplexe Aufgabe.

Leider gibt es keine visuelle Möglichkeit, dies über SSMS zu tun.

SQL Server 2008 unterstützt das Festlegen von Kollatierungen auf den folgenden Ebenen:

  • Server

  • Datenbank

  • Säule

  • Ausdruck

Die Standardinstallationseinstellungen werden vom Windows-Systemgebietsschema bestimmt. Die Sortierung auf Serverebene kann entweder während des Setups oder durch Ändern des Windows-Systemgebietsschemas vor der Installation geändert werden. Mehr...

Festlegen und Ändern der Server-Sortierung - SQL Server 2008

  • Stellen Sie sicher, dass Sie über alle Informationen oder Skripts verfügen, die zum erneuten Erstellen Ihrer Benutzerdatenbanken und aller darin enthaltenen Objekte erforderlich sind.

  • Exportieren Sie alle Ihre Daten mit einem Tool wie dem bcp-Dienstprogramm. Weitere Informationen finden Sie unter Importieren und Exportieren von Massendaten.

  • Löschen Sie alle Benutzerdatenbanken.

  • Erstellen Sie die master-Datenbank unter Angabe der neuen Sortierung in der Eigenschaft SQLCOLLATION des Befehls setup neu

  • Erstellen Sie alle Datenbanken und alle Objekte in ihnen.

  • Importieren Sie alle Ihre Daten.

Festlegen und Ändern der Datenbanksortierung - SQL Server 2008

  • Setzen Sie die COLLATIONOption in der CREATE DATABASEAnweisung, während Sie eine neue Datenbank erstellen.
  • Legen Sie auf ähnliche Weise die COLLATIONOptionen in der ALTER DATABASEAnweisung fest, um die Sortierung einer vorhandenen Datenbank zu ändern.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Festlegen und Ändern der Spaltensortierung

  • Einige der Spaltensortierungen bleiben auch nach dem Ändern der Datenbanksortierung unverändert. In diesem Fall müssen Sie die Sortierung der einzelnen Spalten ändern.
CoderHawk
quelle
6

Stellen Sie sicher, dass Sie die Benutzerdatenbanken wirklich löschen möchten, wie in der obigen Antwort angegeben. Möglicherweise möchten Sie nur die Datenbanken "trennen". Sie können aber auch nichts tun, da durch das Neuerstellen des Masters alle Verknüpfungen zu den Benutzerdatenbanken entfernt werden. Es gibt Zeiten, in denen die Datenbanken in der gewünschten Sortierung erstellt werden, der Server jedoch nicht. In diesem Fall müssen Sie nicht alle Benutzerdatenbanken aus Sicherungen wiederherstellen.

AndrewSQL
quelle
5

Ich habe so etwas gemacht und es hat funktioniert, aber Sie müssen bedenken, dass die Indizes, die auf den Datentyp text / varchar / nvarchar verweisen, gelöscht werden müssen, das Skript ausführen und dann die Indizes erstellen müssen.

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 

Dies ist meine erste Antwort gepostet Verzeihung mein Durcheinander

Jeffry
quelle
-1

Das Exportieren aller Daten (einschließlich Anmeldungen, Verbindungsservern, SQL Agent-Jobs, DB Mail-Einstellungen usw.) und das Neuerstellen der Daten auf Instanzebene sowie das erneute Laden aller Benutzerdaten sind sehr aufwändig. Und auch nach alledem gibt es keine Garantie, dass Sie die Standardkollatierung einer Datenbank über aktualisieren können, ALTER DATABASEda verschiedene Bedingungen den Abschluss des Vorgangs verhindern (weitere Informationen finden Sie im Abschnitt "Ändern der Datenbankkollatierung" in der ALTER DATABASEDokumentation ). .

Es gibt jedoch eine undokumentierte Methode, die viel einfacher ist. Der Hauptnachteil ist, dass es nicht unterstützt wird. Das soll nicht heißen, dass irgendetwas schief gehen wird, nur, dass Microsoft nicht helfen wird, es zu beheben, wenn etwas passiert (weil sie nie garantiert haben, dass es funktionieren würde).

Die Methode, von der ich spreche, läuft sqlservr.exemit dem -q {new_collation_name}Schalter. Es gibt ein bisschen mehr als das, aber das ist die Grundidee. Diese Methode aktualisiert einfach die System-Metadaten, was Vorteile und Konsequenzen hat. Die wichtigsten sind:

LEISTUNGEN

  • sehr schnell
  • Umgehen Sie die meisten Einschränkungen, die das ALTER DATABASEArbeiten verhindern
  • Wahrscheinlich viel genauer als jedes Skript, das die Leute im Laufe der Jahre erfunden haben, um Objekte abzulegen und neu zu erstellen

DRAWBACKS

  • Nicht unterstützt, wenn etwas schief geht
  • VARCHARDaten können sich ändern, WENN sich die Codepage zwischen der alten und der neuen Kollatierung unterscheidet und Zeichen mit Werten von 128 - 255 (0x80 - 0xFF) vorhanden sind und diese Zeichen nicht als dasselbe Zeichen mit demselben Wert im neuen Code vorhanden sind Seite. Es besteht also die Möglichkeit eines Datenverlusts, und Ihre Daten müssen erst untersucht werden, um sicherzustellen, dass diese Bedingung nicht vorliegt. Dies bedeutet jedoch auch, dass es viele Fälle gibt, in denen nur Zeichen mit Werten von 0 bis 127 vorkommen, die selbst bei einer Änderung der Codepage nicht gefährdet sind.
  • Benutzerdefinierte Tabellentypen (UDTTs) werden übersprungen und müssen manuell aktualisiert werden.

Eine ausführliche Beschreibung der Funktionsweise der sqlservr.exe -qMethode (einschließlich Einzelheiten zur Funktionsweise von Kollatierungen auf den verschiedenen Ebenen und mögliche Probleme, auf die Sie achten müssen) finden Sie in meinem Beitrag:

Ändern der Sortierung der Instanz, der Datenbanken und aller Spalten in allen Benutzerdatenbanken: Was könnte möglicherweise schief gehen?

So ändern Sie nur die Instanz (einschließlich den Systemdatenbanken: master, model, msdb, und tempdb) und einer oder mehr Datenbanken (aber nicht alle Datenbanken), einfach die Datenbank trennen (n) , dass Sie von dieser Operation ausschließen möchten, und dann wieder fixieren Sobald die Sortierungsaktualisierung abgeschlossen ist.

Solomon Rutzky
quelle