Festlegen oder Ändern der Spaltensortierung

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

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 zu sehen.

    • Direkte Konvertierung: Betrachten Sie eine der unten definierten vorhandenen 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: Betrachten Sie eine der nachfolgend definierten vorhandenen 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 In-Place-Konvertierung, aber der Umgang mit komplexen Schemas mit vielen Abhängigkeiten (FKs, PKs, Triggern, DFs) und die Synchronisierung des hinteren Teils der Tabelle (wenn die Datenbank in Gebrauch ist) erfordern mehr Planung.

    Weitere Informationen finden Sie unter Sortierungs- und Unicode-Support.

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

  • Verwenden der 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 mit tempdb arbeiten, enthält die COLLATE Klausel eine database_default Option, um anzugeben, dass eine Spalte in einer temporären Tabelle den Sortierstandard der aktuellen Benutzerdatenbank für die Verbindung anstelle der Sortierung von tempdb verwendet.

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 konvertiert die Werte implizit in die Kollation der Spalte.

Sortierungen und tempdb

Die tempdb-Datenbank wird bei jedem Start von SQL Server erstellt und weist die gleiche Standardsortierung wie die model-Datenbank auf. Dies entspricht normalerweise der Standardkollation 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. Zum 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. Zum Beispiel:

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

Da tempdb die Standardsortierung des Servers verwendet und TestPermTab.Col1 eine andere Sortierung verwendet, gibt SQL Server den folgenden Fehler zurück: „Ein Sortierungskonflikt zwischen ‚Latin1_General_CI_AS_KS_WS‘ und ‚Estonian_CS_AS‘ kann bei einer Gleichheitsoperation nicht aufgelöst werden.“

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

  • Legen Sie fest, dass die Spalte der temporären Tabelle die Standardsortierung der Benutzerdatenbank und nicht die von tempdb verwendet. 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  
       );  
    

Siehe auch

Die Serverkollation festlegen oder ändern
Festlegen oder Ändern der Datenbanksortierung
Sortierung und Unicode-Unterstützung