Change SQL Server Database Collation

Potrebbe venire un momento in cui è necessario modificare il database per utilizzare un confronto diverso.

È possibile farlo utilizzando il seguente snippet:

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

Quando si esegue il pezzo di codice sopra si può venire attraverso il seguente errore:

Il database non può essere bloccato in modo esclusivo per eseguire l’operazione

Questo errore si verifica quando il database è in modalità Multi-Utente o quando ci sono oggetti, facendo riferimento al tuo database.

Per superare questo errore, è necessario eseguire le seguenti operazioni:

  1. Impostare il database in modalità utente singolo;
  2. Eseguire le modifiche necessarie al database, in questo caso modificare le regole di confronto;
  3. Impostare il database in modalità multiutente.

Quindi, il frammento di cui sopra può essere aggiornato al seguente:

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

Il processo di cui sopra può essere utilizzato se si è appena creato un nuovo database, senza dati all’interno, senza impostare le regole di confronto del database desiderate.

Cambia le regole di confronto in Colonne di tabella

Nel tuo database potrebbero esserci colonne di tabelle con regole di confronto diverse, ovvero colonne di tabelle di tipi char, varchar, text, nchar, nvarchar e ntext. Per elencare tutte le colonne della tabella con le relative regole di confronto correnti, è possibile eseguire la seguente query:

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

Prima di apportare modifiche alle regole di confronto di queste colonne, è necessario verificare se le modifiche genereranno problemi alle applicazioni.

Per modificare una raccolta di colonne in una nuova, è possibile eseguire la seguente query:

ALTER TABLE ALTER COLUMN <ColumnType> COLLATE <NewCollation>

In caso di errore, assicurarsi che i vincoli e gli indici di riferimento siano eliminati; è possibile ricreare quelli dopo che le regole di confronto sono state modificate.

Modifica regole di confronto e dati esistenti

Che dire dei dati esistenti? Per essere sicuri che i dati esistenti siano recuperabili dopo aver modificato le regole di confronto, è necessario seguire i passaggi seguenti:

  1. esportare i vecchi dati da ogni tabella, utilizzando SQL Server Import ed Export data wizard o bcp;
  2. eliminare e ricreare le tabelle; e
  3. importare i dati precedentemente esportati.

Nel seguente esempio creeremo un database con collation LATIN1_GENERAL_CI_AI, aggiungeremo una tabella Prodotti con un nome di colonna (nvarchar(50)) e inseriremo alcuni dati in greco.

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

Cercando tutti i prodotti che iniziano con “ΠροόΌν” (parola greca per Prodotto), otteniamo 5 risultati:

SELECT *FROM dbo.ProductsWHERE Name LIKE N'Προϊόν%';-- Results:Name--------------------------------------------------Προϊόν 1Προϊόν 2Προϊόν 3Προϊόν 4Προϊόν 5

Punto 1. Esporta dati

Esportiamo i dati nella tabella Prodotti utilizzando bcp, che sta per bulk copy Program utility (bcp) e copia in blocco i dati tra un’istanza di Microsoft SQL Server e un file di dati in un formato specificato dall’utente. Questa utility può essere utilizzata per importare un gran numero di nuove righe in tabelle SQL Server o per esportare i dati dalle tabelle in file adata. Per fare ciò, abbiamo bisogno del seguente comando:

bcp CollationTest.dbo.Products out Products.txt -c -T

dove -c esegue l’operazione utilizzando un tipo di dati di carattere e -T specifica che l’utilità bcp si connette a SQL Server con una connessione attendibile utilizzando la sicurezza integrata.

Punto 2. Change Database Collation

Nella fase successiva cambieremo database collation in GREEK_CI_AI, con la seguente istruzione:

-- Alter database collationALTER DATABASE COLLATE GREEK_CI_AI;

Punto 3. Eliminare e ricreare la tabella Prodotti

USE GODROP TABLE .;GOCREATE TABLE .( (50) NULL) ON GO

Passaggio 4. Importa i dati precedentemente esportati

Per farlo, useremo nuovamente l’utilità bcp ma invece del parametro out useremo il parametro in :

bcp CollationTest.dbo.Products in Products.txt -c -T

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.