Discussione:
cambio di collate
(troppo vecchio per rispondere)
Roberto Nenni
2007-04-26 07:10:00 UTC
Permalink
ho un database XXX dove la collate di default è Latin1_General_CI_AS
tutti gli altri database hanno invece SQL_Latin1_General_CP1_CI_AS, compreso
TEMPDB
vorrei allineare quindi il database XXX alla stessa collate di tutti gli
altri

ho eseguito il comando
alter database XXX collate SQL_Latin1_General_CP1_CI_AS
vedo però che questo comando modifica solo il default per le nuove tabelle,
ma non modifica quelle esistenti e quindi presumo di dover fare una serie di
alter table alter column colonna varchar(xxx) collate
SQL_Latin1_General_CP1_CI_AS xxx
obbligandomi quindi a rispecificare tutti gli attributi della colonna (tipo,
dimensione, null/not null, default....)
inoltre non è possibile eseguire la modifica di una colonna se essa fa parte
di un oggetto esterno (primary key o altri indici), il messaggio emesso è
Server: messaggio 5074, livello 16, stato 8, riga 1
Il indice 'xxxxxxxxx' dipende da colonna 'xxxxxx'.

domande:
sbaglio qualcosa?
c'è un modo più veloce per fare questa manovra?
esiste un tool che lo fa?

grazie a tutti

Roberto Nenni
Andrea Benedetti
2007-04-26 07:35:48 UTC
Permalink
Salve Roberto,
Post by Roberto Nenni
ho un database XXX dove la collate di default è Latin1_General_CI_AS
tutti gli altri database hanno invece SQL_Latin1_General_CP1_CI_AS,
compreso TEMPDB
vorrei allineare quindi il database XXX alla stessa collate di tutti gli
altri
ho eseguito il comando
alter database XXX collate SQL_Latin1_General_CP1_CI_AS
vedo però che questo comando modifica solo il default per le nuove
tabelle, ma non modifica quelle esistenti e quindi presumo di dover fare
una serie di
alter table alter column colonna varchar(xxx) collate
SQL_Latin1_General_CP1_CI_AS xxx
obbligandomi quindi a rispecificare tutti gli attributi della colonna
(tipo, dimensione, null/not null, default....)
inoltre non è possibile eseguire la modifica di una colonna se essa fa
parte di un oggetto esterno (primary key o altri indici), il messaggio
emesso è
Server: messaggio 5074, livello 16, stato 8, riga 1
Il indice 'xxxxxxxxx' dipende da colonna 'xxxxxx'.
sbaglio qualcosa?
c'è un modo più veloce per fare questa manovra?
esiste un tool che lo fa?
No, non sbagli nulla.
SQL Server si comporta correttamente: a partire da quando modifichi la
collation di default del database ogni nuovo oggetto seguirà le regole
definite. Tutti gli altri oggetti già presenti manterranno le impostazioni
definite.

Per modificare la collation delle tabelle già presenti devi ricorrere, come
dici, ad istruzioni "alter table... alter column..."
Qui: http://www.absistemi.it/tipsql.aspx?id=21 trovi un piccolo script che
fa proprio quello di cui hai bisogno (analizza *bene* quello che fa).

Un piccolo (piccolissimo) stratagemma potrebbe essere quello di scriptare il
database in modalità SQL 7.
In questo modo lo script non porterà con se le istruzioni di COLLATE e
quindi, rieseguendolo il database (e quindi le tabelle e le colonne)
prenderà la collation di default.

Comunque, prima di qualsiasi operazione, fa sempre un bel backup!
Non fa mai male ;-)
Post by Roberto Nenni
grazie a tutti
Roberto Nenni
Ciao!
--
Andrea Benedetti
Microsoft MVP - SQL Server
www.absistemi.it - www.ugiss.org
http://blogs.ugidotnet.org/ab
http://mvp.support.microsoft.com
http://italy.mvps.org
Roberto Nenni
2007-04-26 09:09:04 UTC
Permalink
Post by Andrea Benedetti
No, non sbagli nulla.
SQL Server si comporta correttamente: a partire da quando modifichi la
collation di default del database ogni nuovo oggetto seguirà le regole
definite. Tutti gli altri oggetti già presenti manterranno le impostazioni
definite.
è quello che temevo
Post by Andrea Benedetti
Per modificare la collation delle tabelle già presenti devi ricorrere,
come dici, ad istruzioni "alter table... alter column..."
Qui: http://www.absistemi.it/tipsql.aspx?id=21 trovi un piccolo script che
fa proprio quello di cui hai bisogno (analizza *bene* quello che fa).
l'ho preso e l'ho usato per produrmi lo script delle variazioni da fare,
molto comodo
Post by Andrea Benedetti
Un piccolo (piccolissimo) stratagemma potrebbe essere quello di scriptare
il database in modalità SQL 7.
In questo modo lo script non porterà con se le istruzioni di COLLATE e
quindi, rieseguendolo il database (e quindi le tabelle e le colonne)
prenderà la collation di default.
non capisco cosa intendi, non ho mai lavorato con SQL 7

grazie molte

ciao
Roberto
Andrea Benedetti
2007-04-26 09:35:24 UTC
Permalink
Salve Roberto,

"Roberto Nenni" <***@dpinfoSENZAQUESTO.it> ha scritto nel messaggio news:46306c31$0$20823$***@news.tiscali.it...
[cut]
Post by Roberto Nenni
Post by Andrea Benedetti
Un piccolo (piccolissimo) stratagemma potrebbe essere quello di scriptare
il database in modalità SQL 7.
In questo modo lo script non porterà con se le istruzioni di COLLATE e
quindi, rieseguendolo il database (e quindi le tabelle e le colonne)
prenderà la collation di default.
non capisco cosa intendi, non ho mai lavorato con SQL 7
Supponi di avere un database simile a:

use master
go

create database test
go

use test
go

create table stranaCollate
(
colonna varchar(20) collate Polish_CI_AS
)
go


Se scripti questo db con compatibilità SQL Server 7 (che non gestiva la
COLLATION) ottieni:

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[stranaCollate]') and OBJECTPROPERTY(id, N'IsUserTable') =
1)
drop table [dbo].[stranaCollate]
GO

CREATE TABLE [dbo].[stranaCollate] (
[colonna] [varchar] (20) NULL
) ON [PRIMARY]
GO

Come vedi la colonna della tabella *non* ha l'impostazione di collate.
Quando eseguirai questo script su un altro server / istanza la colonna
prenderà quindi la collation di default.
Post by Roberto Nenni
grazie molte
Prego!
Post by Roberto Nenni
ciao
Roberto
Ciao!
--
Andrea Benedetti
Microsoft MVP - SQL Server
www.absistemi.it - www.ugiss.org
http://blogs.ugidotnet.org/ab
http://mvp.support.microsoft.com
http://italy.mvps.org
Lorenzo Benaglia
2007-04-26 08:04:16 UTC
Permalink
Post by Roberto Nenni
c'è un modo più veloce per fare questa manovra?
esiste un tool che lo fa?
Ciao Roberto,

come ti ha spiegato Andrea l'unico modo corretto per modificare la collation
di una colonna preesistente consiste nell'eseguire il comando ALTERT TABLE.
Tempo fa per scrupolo, ho provato a giocare con le tabelle di sistema.
In questo thread trovi tutti i passi:
http://groups.google.it/group/microsoft.public.it.sql/browse_thread/thread/6d931be56ac1f0f5/

ATTENZIONE: se hai definito degli indici clustered al termine
dell'operazione dovrai ricostruirli altrimenti otterrai comportamenti
"bizzarri" :-D
Inoltre questo metodo non è supportato, pertanto non mi prendo la
responsabilità di eventuali corruzioni o perdite di dati :-)
Post by Roberto Nenni
grazie a tutti
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Continua a leggere su narkive:
Loading...