När du utvecklar en applikation eller skriver en kod i SQL-databassystemet är det avgörande att förstå hur data kommer att sorteras och jämföras. Du kan lagra dina data på ett specifikt språk, eller så kanske du vill att SQL Server ska behandla skiftlägeskänsliga och skiftlägesokänsliga data separat. Microsoft har tillhandahållit en SQL Server-inställning som heter Sortering för att kontrollera och hantera sådana krav.
Vad är sortering i SQL Server?
Vi kan ställa in sorteringen på olika nivåer i SQL Server enligt nedan.
- Servernivå
- Databasnivå
- Kolumnnivå
- Uttrycksnivå
Servernivåsorteringen kan ibland kallas SQL Server Instance level collation .
Sorteringen på databasnivå kommer att ärvas från inställningen för sortering på servernivå om du inte väljer någon specifik sortering under skapandet av databasen. Du kan också ändra sorteringen på databasnivå senare. Observera att ändring av databassortering endast kommer att tillämpas för kommande eller nya objekt som kommer att skapas efter sorteringsändringen.
Ny sortering kommer inte att ändra befintliga data lagrade i tabeller som sorterades med den senaste sorteringstypen. Applikationsteamet behöver ytterligare planering för att hantera denna lagrade datakonvertering på grund av den nya sorteringsinställningen.
Det finns flera sätt att göra det på. En är att kopiera data från den befintliga tabellen till en ny tabell skapad med den nya sorteringen och sedan ersätta den gamla tabellen med den nya. Du kan också flytta dina tabelldata till en ny databas genom att ha en ny sortering och ersätta den gamla databasen med den nya.
OBS :Att ändra sortering är en komplex uppgift och du bör undvika det om du inte har ett obligatoriskt affärscase.
Hur hittar och ändrar man databassortering i SQL Server?
Låt oss gå vidare och kontrollera sammanställningen av SQL Server Instance och alla databaser som finns på den instansen. Du kan kontrollera sorteringen genom att gå till egenskaper i databasen eller på instansnivå fönster med SQL Server Management Studio eller genom att helt enkelt exekvera T-SQL-satsen nedan. Sorteringen för varje databas lagras i systemobjektet sys.databases – vi kommer åt den för att få den här informationen.
--Check Database Collation
SELECT name, collation_name
FROM sys.databases
GO
--Check Server or Instance level Collation
SELECT SERVERPROPERTY('Collation') As [Instance Level Collation]
Jag har kört ovanstående T-SQL-sats och fick utdata nedan. Vi kan se att alla databaser och sortering på servernivå har samma inställningar som SQL_Latin1_General_CP1_CI_AS . Det betyder att databaskollationer har ärvts av sorteringen på servernivå när de skapades, och att standardvärdet inte har ändrats.
Låt mig nu visa dig hur du kontrollerar databassorteringen med GUI i SQL Server Management Studio.
Anslut först till din SQL Server-instans med SQL Server Management Studio. Expandera instansnoden följt av databaserna mapp. Högerklicka på måldatabasen och välj Egenskaper :
Du får nedanstående Databasegenskaper fönster.
Klicka nu på Alternativ fliken från den vänstra panelen. Du kommer att få flera egenskapsinställningar i panelen till höger. Sortering är den första egenskapen på denna sida – du kan se att den är samma som den var i ovanstående T-SQL-skript.
På samma sätt kan du klicka på SQL Server-instansnoden och högerklicka på egenskaper på instansnivån. för att se sorteringen på servernivå.
Om du vill ändra denna sortering till en ny sortering behöver du bara klicka på Sortering rullgardinsmenyn och välj det alternativ du behöver. Se till att du har gjort en fullständig säkerhetskopiering av din databas innan du gör det.
Jag har valt en liknande sortering med skiftlägeskänslig SQL_Latin1_General_CP1_CS _AS för den här databasen och klickade på OK att tillämpa den. Obs:Se till att ingen är ansluten till måldatabasen under denna procedur, annars måste du byta läge till enanvändare ett och ändra denna konfiguration.
Du kan också ändra denna databassortering med hjälp av T-SQL-satsen. Använd KOLLERA för det satsen i ALTER DATABASE-satsen.
Först har vi bytt databasen till enanvändare läge, ändrade sedan sorteringen och flyttade slutligen databasen till multi-användar läge.
--Change Database Collation using T-SQL
USE master;
GO
Alter DATABASE [AdventureWorks2019] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [AdventureWorks2019]
COLLATE SQL_Latin1_General_CP1_CI_AS;
GO
Alter DATABASE [AdventureWorks2019] SET MULTI_USER
Lista över alla sorteringar som stöds i SQL Server
Det här avsnittet visar hur du hittar alla tillgängliga sorteringar i SQL Server. Låt mig först visa dig hur du får listan över alla sorteringar som stöds för SQL Server-instansen.
SQL Server har en systemfunktion som heter fn_helpcollations() som du kan använda för att hämta alla sorteringar.
Kör kommandot nedan för att visa listan.
--Display the list of all collations
SELECT name, description FROM fn_helpcollations()
Vi kan se alla 5508 sammanställningar som stöds i utdatasektionen. Om du inte är säker på vilken sortering du ska välja kan du använda WHERE-satsen i skriptet nedan för att filtrera bort alla möjliga sorteringar som kan ställas in i databasen.
Låt oss säga att du behöver lagra dina data på amerikansk engelska och vill att SQL Server ska hantera det i ett skiftlägeskänsligt format. Du kan använda kommandot nedan för att hämta listan över möjliga och stödda sorteringar för din fråga:
--Display the list of all collations with WHERE clause
SELECT Name, Description FROM fn_helpcollations()
WHERE Name like 'SQL_Latin1%' AND Description LIKE '%case-sensitive%’
Resultatet visar endast 10 sorteringar som uppfyller din fråga. Du kan använda skriptet ovan för att filtrera bort olika sorteringar.
Inverkan av att ändra databassortering på frågeutdata
I det här avsnittet kommer jag att visa dig skillnaden mellan de två utdata från samma fråga när de körs med olika sorteringar.
Först kommer jag att skapa en databas med namnet MSSQL med en sortering (SQL_Latin1_General_CP1_CS _AS ). Sedan kör jag samma fråga två gånger för att få utdata. Senare kommer jag att ändra sorteringen till SQL_Latin1_General_CP1_CI _AS och kör samma frågor igen för att få ut resultatet. Du kan jämföra båda utdata och förstå effekten av att ändra en databassortering. Så låt oss börja med att skapa databas.
Starta det nya fönstret för att skapa databasen som visas i bilden nedan. Du kan också skapa denna databas med T-SQL. Efter det kan du se databasnamnet och dess datafiler. Klicka nu på den andra fliken på panelen till vänster för att växla till fönstret för sorteringsegenskaper.
Du kan se att sorteringsnamnet för denna databas är standard . Det betyder att den här databasen kommer att ärva sortering från sorteringstypen på servernivå. Klicka på Sortering rullgardinsmenyn för att välja din nya sortering.
Jag har valt nedanstående sortering SQL_Latin1_General_CP1_CS _AS för denna databas – inte standard. Klicka på OK för att fortsätta med att skapa databasen.
Kontrollera nu databassamlingen för en nyskapad databas. Vi kan se att det är SQL_Latin1_General_CP1_CS _AS som vi har valt i föregående steg.
I SQL_Latin1_General_CP1_CS _AS , CS står för skiftlägeskänsliga läge och CI står för skiftlägeskänsligt läge. Nu kan du köra antingen T-SQL-koden nedan eller valfri kod för att få utdata.
Jag har kört samma kommando två gånger. Det första skriptet filtrerar kolumnnamnen med värdet SYS i kapital bokstäver, medan det andra skriptet kommer att filtrera samma kolumn med samma värde sys i små brev. Utdatasektionen visar att det första skriptet inte har visat någon utdata, medan det andra skriptet har visat resultatet på grund av dess skiftlägeskänsliga beteende.
Select * from sysusers
Where name=’SYS’
Go
Select * from sysusers
Where name=’sys’
GO
Nu kommer vi att ändra sorteringen av denna databas till den skiftlägesokänsliga sorteringen SQL_Latin1_General_CP1_CI _AS genom att köra nedanstående T-SQL-satser. Du kan också ändra det via GUI genom att öppna fönstret Databas Properties i SQL Server Management Studio.
--Change database collation to SQL_Latin1_General_CP1_CI_AS
USE master;
GO
Alter DATABASE [MSSQL] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [MSSQL]
COLLATE SQL_Latin1_General_CP1_CI_AS;
GO
Alter DATABASE [MSSQL] SET MULTI_USER
Jag har kört ovanstående skript i en enda gång, och databassorteringen ändrades framgångsrikt till en ny sortering med skiftlägesokänsligt stöd.
Du kan verifiera denna ändring genom att köra skripten nedan för att kontrollera sammanställningen av den nyskapade databasen MSSQL. Vi kan se att den nya sorteringen är inställd för denna databas i bilden nedan.
Vi kommer att köra samma T-SQL-sats igen innan vi ändrar sammanställningen för att se effekten av denna förändring. Som vi kan se nu finns båda T-SQL-satserna i utgången.
Slutsats
Jag hoppas att det är uppenbart att sammanställningen i SQL Server är avgörande. Vi har definierat vilken effekt det ger om du gör ändringar i sortering på valfri nivå i SQL Server. Gör alltid ordentlig planering och testa ändringarna i din lägre livscykelmiljö först.
Håll utkik efter min nästa artikel, där jag kommer att visa dig en steg-för-steg-metod för att ändra sortering på servernivå.
Dela den här artikeln och ge din feedback, det hjälper oss att förbättra.