un moment poate veni atunci când va trebui să modifice baza de date pentru a utiliza o altă colaționare.
puteți face acest lucru utilizând următorul fragment:
USE master;GOALTER DATABASE COLLATE SQL_Latin1_General_CP1_CI_AS ;GO--Verify the collation setting.SELECT name, collation_nameFROM sys.databasesWHERE name = N'';GO
când executați fragmentul de mai sus, este posibil să întâlniți următoarea eroare:
această eroare apare atunci când baza de date este în modul Multi-utilizator sau când există obiecte care se referă la baza de date.
pentru a depăși această eroare, trebuie să efectuați următorii pași:
- setați baza de date la modul cu un singur utilizator;
- efectuați modificările necesare la baza de date, în acest caz change collation;
- setați baza de date înapoi la modul multi-utilizator.
deci, fragmentul de mai sus poate fi actualizat la următorul:
USE master;GO-- Set to single-user modeALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEGO -- change collationALTER DATABASE COLLATE SQL_Latin1_General_CP1_CI_AS; GO -- Set to multi-user modeALTER DATABASE SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO --Verify the collation setting. SELECT name, collation_name FROM sys.databases WHERE name = N'MyOptionsTest'; GO
procesul de mai sus poate fi utilizat dacă tocmai ați creat o nouă bază de date, fără date în interior, fără a seta colaționarea dorită a bazei de date.
schimbați colaționarea în coloane de tabel
în baza dvs. de date pot exista coloane de tabel cu colaționare diferită, și anume coloane de tabel de tipuri char, varchar, text, nchar, nvarchar și ntext. Pentru a lista toate coloanele tabelului cu colaționările lor curente, puteți executa următoarea interogare:
SELECT t.name, c.name, c.collation_nameFROM sys.columns c INNER JOIN sys.tables t ON t.object_id = c.object_idWHERE c.object_id IN (SELECT object_id FROM sys.objects WHERE type = 'U') AND c.collation_name != 'NULL'ORDER BY t.name, c.name
înainte de a efectua modificări la colaționările acestor coloane, trebuie să verificați dacă modificările vor genera probleme aplicațiilor.
pentru a modifica o colaționare coloană la una nouă, puteți rula următoarea interogare:
ALTER TABLE ALTER COLUMN <ColumnType> COLLATE <NewCollation>
în cazul unei erori, asigurați-vă că constrângerile de referință și indexurile sunt abandonate; le puteți recrea după ce colaționarea a fost modificată.
colaționare schimbare și datele existente
ce zici de datele existente? Pentru a vă asigura că datele existente sunt recuperabile după modificarea colaționării, trebuie să urmați pașii de mai jos:
- exportați date vechi din fiecare tabel, fie folosind SQL Server import și Export Data wizard sau bcp;
- drop și recreați tabelele; și
- importați datele exportate anterior.
în exemplul următor vom crea o bază de date cu colaționare LATIN1_GENERAL_CI_AI, adăugați un tabel produse cu un nume de coloană (nvarchar(50)) și introduceți câteva date în limba greacă.
CREATE DATABASE COLLATE LATIN1_GENERAL_CI_AI;-- -- Create Products table and add some dataUSE GOCREATE TABLE .( (50) NULL) ON GOinsert into dbo.Products (name) values (N'Προϊόν 1');insert into dbo.Products (name) values (N'Προϊόν 2');insert into dbo.Products (name) values (N'Προϊόν 3');insert into dbo.Products (name) values (N'Προϊόν 4');insert into dbo.Products (name) values (N'Προϊόν 5');
cautam toate produsele incepand cu” Hectolix ” (cuvantul grecesc pentru produs), obtinem 5 rezultate:
SELECT *FROM dbo.ProductsWHERE Name LIKE N'Προϊόν%';-- Results:Name--------------------------------------------------Προϊόν 1Προϊόν 2Προϊόν 3Προϊόν 4Προϊόν 5
Pasul 1. Exportați date
să exportăm date în tabelul produse utilizând bcp, care înseamnă bulk copy program utility (bcp) și bulk copiază date între o instanță de Microsoft SQL Server și un fișier de date într-un format specificat de utilizator. Acest utilitar poate fi folosit pentru a importa un număr mare de rânduri noi în tabele SQL Server sau pentru a exporta date din tabele în fișier adata. Pentru a face acest lucru, avem nevoie de următoarea comandă:
bcp CollationTest.dbo.Products out Products.txt -c -T
unde -c
efectuează operația utilizând un tip de date de caractere și -T
specifică faptul că utilitarul bcp se conectează la SQL Server cu o conexiune de încredere utilizând securitate integrată.
Pasul 2. Schimbați colaționarea bazei de date
în pasul următor vom schimba colaționarea bazei de date în GREEK_CI_AI, cu următoarea declarație:
-- Alter database collationALTER DATABASE COLLATE GREEK_CI_AI;
Pasul 3. Aruncați și recreați tabelul produse
USE GODROP TABLE .;GOCREATE TABLE .( (50) NULL) ON GO
Pasul 4. Importați datele exportate anterior
pentru a face acest lucru, vom folosi din nou utilitarul bcp, dar în loc de parametrul out
vom folosi parametrul in
:
bcp CollationTest.dbo.Products in Products.txt -c -T