Udostępnij za pośrednictwem


Ustawianie lub zmienianie sortowania kolumn

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Możesz zastąpić sortowanie bazy danych dla char, varchar, text, nchar, nvarchari ntext danych przez określenie innego sortowania dla specyficznej kolumny w tabeli i użycie jednej z następujących wartości:

  • klauzula COLLATE dla instrukcji CREATE TABLE i ALTER TABLE, jak pokazano w poniższych przykładach.

    • Konwersja w miejscu. Rozważ jedną z istniejących tabel zdefiniowanych poniżej:

      -- 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);
      

      Aby bezpośrednio przekonwertować kolumnę do użycia UTF-8, uruchom instrukcję ALTER COLUMN, która ustawia wymagany typ danych i sortowanie z obsługą UTF-8.

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

      Ta metoda jest łatwa do zaimplementowania, jednak jest to prawdopodobnie operacja blokująca, która może stać się problemem dla dużych tabel i zajętych aplikacji.

    • Skopiuj i zastąp. Rozważ jedną z istniejących tabel zdefiniowanych poniżej:

      -- 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
      

      Aby przekonwertować kolumnę w celu użycia formatu UTF-8, skopiuj dane do nowej tabeli, w której kolumna docelowa jest już wymaganym typem danych i sortowaniem z włączoną obsługą protokołu UTF-8, a następnie zastąp starą tabelę:

      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
      

      Ta metoda jest znacznie szybsza niż konwersja w miejscu, ale obsługa złożonych schematów z wieloma zależnościami (FKs, PKs, Triggers, DFs) i synchronizowanie ogona tabeli (jeśli baza danych jest używana) wymaga więcej planowania.

    Aby uzyskać więcej informacji, zobacz Sortowanie i obsługa Unicode.

  • SQL Server Management Studio. Aby uzyskać więcej informacji, zobacz Modyfikowanie kolumn (silnik bazy danych).

  • Za pomocą właściwości Column.Collation w obiektach zarządzania serwerem SQL (SMO).

Nie można zmienić sortowania kolumny, do której obecnie odwołuje się jeden z następujących elementów:

  • Kolumna obliczana
  • Indeks
  • Statystyki dystrybucji generowane automatycznie lub przez instrukcję CREATE STATISTICS
  • Ograniczenie CHECK
  • Ograniczenie klucza obcego

Podczas pracy z tempdbklauzula COLLATE zawiera opcję database_default, aby określić, że kolumna w tabeli tymczasowej używa domyślnego sortowania z bieżącej bazy danych użytkownika w kontekście połączenia zamiast sortowania tempdb.

Porządki sortowania i kolumny tekstowe

Można wstawić lub zaktualizować wartości w kolumnie tekstowej , której sortowanie różni się od strony kodowej domyślnego sortowania bazy danych. Program SQL Server niejawnie konwertuje wartości na sortowanie kolumny.

Sortowania i baza danych tempdb

Baza danych bazy danych tempdb jest tworzona za każdym razem, gdy program SQL Server jest uruchamiany i ma takie samo sortowanie domyślne jak model bazy danych. Zazwyczaj jest to samo, co domyślne sortowanie wystąpienia. W przypadku utworzenia bazy danych użytkownika i określenia innego domyślnego sortowania niż model baza danych użytkownika ma inne domyślne sortowanie niż tempdb. Wszystkie tymczasowe procedury przechowywane lub tabele tymczasowe są tworzone i przechowywane w tempdb. Oznacza to, że wszystkie niejawne kolumny w tabelach tymczasowych oraz wszystkie wymuszane domyślne stałe, zmienne i parametry w tymczasowych procedurach składowanych mają reguły sortowania, które różnią się od porównywalnych obiektów utworzonych w tabelach permanentnych i procedurach składowanych.

Może to prowadzić do problemów z niezgodnością sortowania między zdefiniowanymi przez użytkownika bazami danych i systemowymi obiektami bazy danych. Na przykład instancja SQL Server używa sortowania Latin1_General_CS_AS i wykonuje następujące instrukcje:

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

W tym systemie baza danych tempdb używa sortowania Latin1_General_CS_AS ze stroną kodów 1252, a TestDB i TestPermTab.Col1 używają sortowania Estonian_CS_AS ze stroną kodów 1257. Na przykład:

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  

W poprzednim przykładzie baza danych tempdb używa sortowania Latin1_General_CS_AS, a TestDB i TestTab.Col1 używa sortowania Estonian_CS_AS. Na przykład:

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

Ponieważ tempdb używa domyślnego sortowania serwera, a TestPermTab.Col1 używa innego sortowania, program SQL Server zwraca ten błąd: "Nie można rozwiązać konfliktu sortowania między Latin1_General_CI_AS_KS_WS a Estonian_CS_AS w operacji porównania".

Aby zapobiec temu błędowi, możesz użyć jednej z następujących alternatyw:

  • Określ, że kolumna w tabeli tymczasowej używa domyślnego sortowania bazy danych użytkownika, a nie tempdb. Dzięki temu tabela tymczasowa może pracować z podobnie sformatowanymi tabelami w wielu bazach danych, jeśli jest to wymagane przez system.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • Określ poprawne sortowanie dla kolumny #TestTempTab:

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

Zobacz też

Ustaw lub zmień kolację serwera
Ustaw lub zmień sortowanie bazy danych
Sortowanie i obsługa Unicode