Dela via


Ange eller ändra kolumnsortering

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Du kan åsidosätta databassortering för tecken, varchar, text, nchar, nvarcharoch ntext data genom att ange en annan sortering för en viss kolumn i en tabell och med något av följande:

  • COLLATE-satsen i CREATE TABLE och ALTER TABLE, enligt exemplen här nedan.

    • Konvertering på plats. Överväg en av de befintliga tabellerna som definieras nedan:

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

      Om du vill konvertera kolumnen på plats för att använda UTF-8 kör du en ALTER COLUMN-instruktion som anger den datatyp som krävs och en UTF-8-aktiverad sortering:

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

      Den här metoden är lätt att implementera, men det är en möjligen blockerande åtgärd som kan bli ett problem för stora tabeller och upptagna program.

    • Kopiera och ersätt. Överväg en av de befintliga tabellerna som definieras nedan:

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

      Om du vill konvertera kolumnen till att använda UTF-8 kopierar du data till en ny tabell där målkolumnen redan är den datatyp som krävs och en UTF-8-aktiverad sortering och ersätter sedan den gamla tabellen:

      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
      

      Den här metoden är mycket snabbare än konvertering på plats, men det krävs mer planering för att hantera komplexa scheman med många beroenden (FK:er, PK:er, utlösare, DF:er) och synkronisering av tabellens svans (om databasen används).

    Mer information finns i Collation och Unicode Support.

  • SQL Server Management Studio. Mer information finns i Ändra kolumner (databasmotor).

  • Använda egenskapen Column.Collation i SQL Server Management Objects (SMO).

Du kan inte ändra sortering av en kolumn som för närvarande refereras till av något av följande:

  • En beräknad kolumn
  • Ett index
  • Distributionsstatistik, antingen genererad automatiskt eller av CREATE STATISTICS-instruktionen
  • En CHECK-begränsning
  • Referensnyckelbegränsning

När du arbetar med tempdbinnehåller satsen COLLATE ett database_default alternativ för att ange att en kolumn i en tillfällig tabell använder sorteringsstandarden för den aktuella användardatabasen för anslutningen i stället för sortering av tempdb.

Sorteringsordningar och textkolumner

Du kan infoga eller uppdatera värden i en text kolumn vars sortering skiljer sig från kodsidan för databasens standardsortering. SQL Server konverterar implicit värdena till sortering av kolumnen.

Kollationer och tempdb

Den tempdb- databasen skapas varje gång SQL Server startas och har samma standardsortering som modell databas. Detta är vanligtvis samma som standardsorteringsordningen för instansen. Om du skapar en användardatabas och anger en annan standardsortering än modellhar användardatabasen en annan standardsortering än tempdb. Alla temporära lagrade procedurer eller temporära tabeller skapas och lagras i tempdb. Det innebär att alla implicita kolumner i temporära tabeller och alla konstanter, variabler och parametrar i temporära lagrade procedurer har sorteringar som skiljer sig från jämförbara objekt som skapats i permanenta tabeller och lagrade procedurer.

Detta kan leda till problem med matchningsfel i sortering mellan användardefinierade databaser och systemdatabasobjekt. En instans av SQL Server använder till exempel Latin1_General_CS_AS sortering och du kör följande instruktioner:

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

I det här systemet använder tempdb-databasen Latin1_General_CS_AS-collation med kodsidan 1252, och TestDB och TestPermTab.Col1 använder Estonian_CS_AS-collation med kodsidan 1257. Till exempel:

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  

I föregående exempel använder tempdb-databasen Latin1_General_CS_AS sortering, och TestDB och TestTab.Col1 använder Estonian_CS_AS sortering. Till exempel:

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

Eftersom tempdb använder standardserversortering och TestPermTab.Col1 använder en annan sortering returnerar SQL Server följande fel: "Det går inte att lösa sorteringskonflikten mellan 'Latin1_General_CI_AS_KS_WS' och 'Estonian_CS_AS' i 'lika med'-operationen."

Om du vill förhindra felet kan du använda något av följande alternativ:

  • Ange att den tillfälliga tabellkolumnen använder standardsortering av användardatabasen, inte tempdb. Detta gör att den tillfälliga tabellen kan arbeta med liknande formaterade tabeller i flera databaser, om det krävs av systemet.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • Ange rätt sortering för kolumnen #TestTempTab:

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

Se även

Ange eller ändra serverkollationen
ange eller ändra databassortering
Sortering och Unicode-stöd