Come modificare le regole di confronto di SQL Server


27

Come posso modificare le regole di confronto predefinite di SQL Server 2008 R2 Express per l'intero server e un determinato database?

C'è un modo per farlo utilizzando l'interfaccia visiva di SQL Server Management Studio? Nella finestra Proprietà server (e nella finestra Proprietà database corrispondente), questa proprietà non è disponibile per la modifica.


2
Se si desidera modificare le regole di confronto di tutte le colonne nel database, consultare questo script . Non l'ho provato da solo, ma l'ho trovato per un collega che stava cercando di fare proprio questo.
Justin Dearing

2
Se vuoi cambiare le regole di confronto di un database, dai un'occhiata a questo strumento: codeproject.com/KB/database/ChangeCollation.aspx Funziona con SQL Server 2005 e 2008 e ha funzionato meglio per me rispetto agli script che puoi trovare sul web.
Erwin,

Risposte:


25

Sì.

È possibile modificare le regole di confronto predefinite dell'istanza espressa di SQL Server 2008 R2 e dei singoli database, ma è un'attività complessa.

Purtroppo, non esiste alcuna opzione visiva per farlo tramite SSMS.

SQL Server 2008 supporta l'impostazione delle regole di confronto ai seguenti livelli:

  • server

  • Banca dati

  • Colonna

  • Espressione

Le impostazioni di installazione predefinite sono determinate dalle impostazioni internazionali del sistema Windows. Le regole di confronto a livello di server possono essere modificate durante l'installazione o modificando le impostazioni internazionali del sistema Windows prima dell'installazione. Di Più...

Impostazione e modifica delle regole di confronto del server - SQL Server 2008

  • Assicurarsi di disporre di tutte le informazioni o gli script necessari per ricreare i database utente e tutti gli oggetti in essi contenuti.

  • Esporta tutti i tuoi dati usando uno strumento come l'utilità bcp. Per ulteriori informazioni, consultare Importazione ed esportazione di dati in blocco.

  • Rilascia tutti i database utente.

  • Ricostruire il database principale specificando le nuove regole di confronto nella proprietà SQLCOLLATION del comando di installazione

  • Crea tutti i database e tutti gli oggetti in essi contenuti.

  • Importa tutti i tuoi dati.

Impostazione e modifica delle regole di confronto del database - SQL Server 2008

  • Impostare l' COLLATIONopzione CREATE DATABASEnell'istruzione durante la creazione di un nuovo database.
  • Allo stesso modo, impostare le COLLATIONopzioni ALTER DATABASEnell'istruzione per modificare le regole di confronto di un database esistente.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Impostazione e modifica delle regole di confronto delle colonne

  • Alcune regole di confronto delle colonne rimarranno invariate anche dopo aver modificato le regole di confronto del database. In tal caso, è necessario modificare le regole di confronto delle singole colonne.

6

Assicurati di voler veramente "eliminare" i database degli utenti come indicato nella risposta sopra. Potresti semplicemente voler "staccare" i database. O davvero, non puoi fare nulla poiché la ricostruzione del master rimuove in modo efficace qualsiasi collegamento ai database degli utenti. Ci sono momenti in cui i database vengono creati nelle regole di confronto desiderate ma il server non lo è. In questo caso, non è necessario ripristinare tutti i database utente dai backup.


5

Ho fatto qualcosa del genere e ha funzionato, ma è necessario tenere presente che gli indici che puntano al tipo di dati come text / varchar / nvarchar devono essere eliminati, eseguire lo script e quindi creare gli indici.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

questa è la mia prima risposta postata scusate il mio pasticcio


-1

L'esportazione di tutti i dati (inclusi accessi, server collegati, processi di SQL Agent, impostazioni di DB Mail, ecc.) E la ricostruzione dei dati a livello di istanza, oltre al ricaricamento di tutti i dati dell'utente, richiede molto lavoro. E, anche dopo tutto ciò, non c'è ancora alcuna garanzia che è possibile aggiornare le regole di confronto predefinite di un database tramite ALTER DATABASEperché ci sono diverse condizioni che impediranno il completamento dell'operazione (per i dettagli, consultare la sezione "Modifica delle regole di confronto del database" della ALTER DATABASEdocumentazione ) .

Vi è, tuttavia, un metodo non documentato che è molto più semplice. Lo svantaggio principale è che non è supportato. Questo non vuol dire che qualcosa andrà storto, solo che se qualcosa lo fa, Microsoft non aiuterà a risolverlo (perché non hanno mai garantito che funzionasse).

Il metodo di cui parlo è in esecuzione sqlservr.execon l' -q {new_collation_name}interruttore. C'è un po 'di più, ma questa è l'idea di base. Questo metodo aggiorna semplicemente i metadati di sistema, che ha benefici e conseguenze, i principali sono:

BENEFICI

  • molto veloce
  • bypassare la maggior parte delle restrizioni che impediscono il ALTER DATABASEfunzionamento
  • probabilmente molto più preciso di qualsiasi sceneggiatura che la gente ha ideato nel corso degli anni per eliminare e ricreare oggetti

INCONVENIENTI

  • non supportato se qualcosa va storto
  • VARCHARi dati possono cambiare, SE la tabella codici è diversa tra le regole di confronto vecchie e nuove ed esistono caratteri con valori di 128 - 255 (0x80 - 0xFF) e questi caratteri non esistono come lo stesso carattere con lo stesso valore nel nuovo codice pagina. Quindi esiste il potenziale per la perdita di dati e i tuoi dati devono essere prima di tutto ricercati per garantire che questa condizione non esista. Ma questo significa anche che ci sono molti casi con solo caratteri con valori compresi tra 0 e 127 che non sono in pericolo, anche se la tabella codici cambia.
  • I tipi di tabella definiti dall'utente (UDTT) vengono ignorati e devono essere aggiornati manualmente.

Per una descrizione dettagliata di ciò che il sqlservr.exe -qmetodo fa e non fa (compresi i dettagli su come funzionano le regole di confronto ai vari livelli e i potenziali problemi a cui prestare attenzione), consultare il mio post:

Modifica delle regole di confronto dell'istanza, dei database e di tutte le colonne in tutti i database degli utenti: cosa potrebbe andare storto?

Per modificare solo l'istanza (inclusi i database di sistema: master, model, msdb, e tempdb) ed uno o più database (ma non tutti i database), è sufficiente scollegare il database (s) che si desidera escludere da questa operazione, e poi ricollegare una volta completato l'aggiornamento delle regole di confronto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.