Festlegen oder Ändern der Spaltensortierung

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Sie können die Datenbanksortierung für char-, varchar-, text-, nchar-, nvarchar- und ntext -Daten überschreiben, indem Sie eine andere Sortierung für eine bestimmte Spalte einer Tabelle angeben und dann eine der folgenden Optionen verwenden:

  • Die COLLATE-Klausel von CREATE TABLE und ALTER TABLE (wie in den folgenden Beispielen)

    • Direkte Konvertierung: Orientieren Sie sich an einer der folgenden Tabellen:

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      
      -- VARCHAR column is encoded the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      

      Sie können die Spalte direkt in UTF-8 konvertieren, indem Sie eine ALTER COLUMN-Anweisung ausführen, die den erforderlichen Datentyp und eine UTF-8-fähige Sortierung festlegt:

      ALTER TABLE dbo.MyTable 
      ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8
      

      Diese Methode lässt sich leicht implementieren, es handelt sich jedoch um einen möglicherweise blockierenden Vorgang, der für große Tabellen und ausgelastete Anwendungen zum Problem werden kann.

    • Kopieren und ersetzen: Orientieren Sie sich an einer der folgenden Tabellen:

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      GO
      
      -- VARCHAR column is encoded using the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      GO
      

      Sie können die Spalte in UTF-8 konvertieren, indem Sie die Daten in eine neue Tabelle kopieren, in der für die Zielspalte bereits der erforderliche Datentyp und eine UTF-8-fähige Sortierung festgelegt sind. Anschließend können Sie die alte Tabelle ersetzen:

      CREATE TABLE dbo.MyTableNew (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8);
      GO
      INSERT INTO dbo.MyTableNew 
      SELECT * FROM dbo.MyTable;
      GO
      DROP TABLE dbo.MyTable;
      GO
      EXEC sp_rename 'dbo.MyTableNew', 'dbo.MyTable';
      GO
      

      Diese Methode ist viel schneller als die direkte Konvertierung, aber die Verarbeitung komplexer Schemas mit vielen Abhängigkeiten (Fremdschlüssel, Primärschlüssel, Trigger, DF) und das Synchronisieren des Tabellenendes (wenn die Datenbank gerade verwendet wird) erfordert mehr Planung.

    Weitere Informationen finden Sie unter Collation and Unicode Support.

  • SQL Server Management Studio. Weitere Informationen finden Sie unter Ändern von Spalten (Datenbank-Engine).

  • Die Column.Collation -Eigenschaft in SQL Server Management Objects (SMO).

Sie können die Sortierung einer Spalte nicht ändern, wenn folgende Objekte aktuell auf die Spalte verweisen:

  • Eine berechnete Spalte.
  • Ein Index.
  • Verteilungsstatistiken, die entweder automatisch oder mithilfe der CREATE STATISTICS-Anweisung generiert wurden
  • Eine CHECK-Einschränkung.
  • Eine FOREIGN KEY-Einschränkung.

Wenn Sie tempdbverwenden, enthält die COLLATE -Klausel eine database_defauls -Option, mit der angegeben werden kann, dass für eine Spalte einer temporären Tabelle anstelle der Sortierung von tempdbdie Standardsortierung der aktuellen Benutzerdatenbank für die Verbindung verwendet wird.

Sortierungen und text-Spalten

Sie können Werte in einer text -Spalte einfügen und aktualisieren, deren Sortierung sich von der Codepage der Standardsortierung der Datenbank unterscheidet. SQL Server werden die Werte implizit in die Sortierung der Spalte konvertiert.

Sortierungen und tempdb

Die tempdb -Datenbank wird bei jedem Start von SQL Server erstellt und weist die gleiche Standardsortierung wie die model -Datenbank auf. Dabei handelt es sich normalerweise um die gleiche Sortierung wie die Standardsortierung der Instanz. Wenn Sie eine Benutzerdatenbank erstellen und eine andere Standardsortierung als für die model-Datenbank angeben, verwendet die Benutzerdatenbank eine andere Standardsortierung als die tempdb-Datenbank. Alle temporären gespeicherten Prozeduren oder temporären Tabellen werden in tempdberstellt und gespeichert. Dies bedeutet, dass alle impliziten Spalten in temporären Tabellen und alle Konstanten, Variablen und Parameter mit erzwingbaren Standards in temporär gespeicherten Prozeduren andere Sortierungen aufweisen als die vergleichbaren Objekte, die in dauerhaften Tabellen und gespeicherten Prozeduren erstellt werden.

Dies kann zu Problemen hinsichtlich einer Nichtübereinstimmung in Sortierungen zwischen benutzerdefinierten Datenbanken und Systemdatenbankobjekten führen. Eine Instanz von SQL Server verwendet z. B. die Latin1_General_CS_AS-Sortierung, und Sie führen die folgenden Anweisungen aus:

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;  
USE TestDB;  
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  

In diesem System verwendet die tempdb -Datenbank die Latin1_General_CS_AS-Sortierung mit Codepage 1252, und TestDB und TestPermTab.Col1 verwenden die Estonian_CS_AS -Sortierung mit Codepage 1257. Beispiel:

USE TestDB;  
GO  
-- Create a temporary table with the same column declarations  
-- as TestPermTab  
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  
INSERT INTO #TestTempTab  
         SELECT * FROM TestPermTab;  
GO  

Im vorherigen Beispiel verwendet die tempdb -Datenbank die Latin1_General_CS_AS-Sortierung, und TestDB und TestTab.Col1 verwenden die Estonian_CS_AS -Sortierung. Beispiel:

SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;  

Da tempdb die Standardserversortierung und TestPermTab.Col1 eine andere Sortierung verwendet, wird in SQL Server der folgende Fehler zurückgegeben: „Ein Sortierungskonflikt zwischen ‚Latin1_General_CI_AS_KS_WS‘ und ‚Estonian_CS_AS‘ im Gleich-Vorgang kann nicht aufgelöst werden.“

Sie können den Fehler vermeiden, indem Sie stattdessen eine der folgenden Alternativen verwenden:

  • Geben Sie an, dass für die Spalte der temporären Tabelle die Standardsortierung der Benutzerdatenbank und nicht die Standardsortierung von tempdbverwendet wird. Auf diese Weise kann die temporäre Tabelle mit ähnlich formatierten Tabellen in mehreren Datenbanken arbeiten, wenn dies in dem System erforderlich ist.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • Geben Sie die richtige Sortierung für die #TestTempTab -Spalte an:

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE Estonian_CS_AS  
       );  
    

Weitere Informationen

Festlegen oder Ändern der Serversortierung
Festlegen oder Ändern der Datenbanksortierung
Collation and Unicode Support