Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   ¿Cómo poder cambiar el collate en toda una BBDD de SQL? (https://www.clubdelphi.com/foros/showthread.php?t=20782)

atirado 25-04-2005 20:09:28

¿Cómo poder cambiar el collate en toda una BBDD de SQL?
 
Hola a tod@s!

Primero que nada un saludo a todo el foro :D
Les escribo a ver si alguno de ustedes me puede echar la mano en un asuntito con SQL Server 2000.
He tenido algunos problemas de intercalación del operador "=" al comparar 2 valores en campos que son varchar.
Leyendo un poco, me he enterado que todo es problema del COLLATE (intercalación) de SQL Server, y he modificado algunas tablas con campos varchar.
Sin embargo, tengo alrededor de 50 tablas con campos varchar por base de datos y son cerca de 30 bases de datos las que tendría qué modificar, multiplíquenle que cada tabla tiene 1 ó 2 campos varchar. Eso da un demonial de trabajo "a pie", jeje :p
He visto en las propiedades de cada Base de Datos, que tiene una intercalación "predefinida", sin embargo, esta información viene como sólo lectura.
¿Alguno de ustedes sabe cómo modificarla en TODA la base de datos sin hacerlo campo por campo, tabla por tabla?

¡Agradeceré cualquier información! :D

Un saludo enorme desde México

Alejandro

droguerman 26-04-2005 16:34:33

Nota: eso me funcionó a mí, pero te recomendaría que saques un backup antes

primero cambia la intercalación de la base de datos por ejemplo a SQL_Latin1_General_CP1_CI_AS:
Código:

ALTER DATABASE <nombre> COLLATE SQL_Latin1_General_CP1_CI_AS
luego generamos un script usando el Analizador de Consultas (no es una maravilla de hecho falla con tipos de datos de usuario pero te puede servir)

Código:

SELECT 'ALTER TABLE ' + o.name + ' ALTER COLUMN ' + C.name + ' ' +
        T.name +'(' + CAST(c.length as varchar(4)) + ') COLLATE ' +
 ' SQL_Latin1_General_CP1_CI_AS;'
 from syscolumns C, sysobjects O, systypes T
 where (C.collation is not null) and C.id = O.id and c.TYPE = T.TYPE AND
 C.XUSERTYPE = T.XUSERTYPE AND o.type = 'U' 
 ORDER BY O.NAME;

eso te generará una secuencias de comandos SQL ejecutalos y mucha suerte

atirado 28-04-2005 17:20:30

Re:
 
Muchas gracias, droguerman! ya pude resolver el problema :D

saludos enormes!

gabrielflowers 03-03-2015 16:45:30

resuelto
 
Por si a alguien le sirve la forma correcta de cambiar la intercalacion de una base de datos, de todas sus tablas, y campos seria:

Código SQL [-]

ALTER DATABASE MiBd --bd 
COLLATE Modern_Spanish_CI_AS;  --intercalacion

--

use MiBD--bd
declare @var1 as nvarchar(max)

DECLARE micursor CURSOR SCROLL FOR
SELECT 'ALTER TABLE ' + o.name + ' ALTER COLUMN [' + C.name + '] ' + 
T.name +'(' + CAST(c.length as varchar(4)) + ') COLLATE ' + 
'Modern_Spanish_CI_AS; ' --poner aca la intercalacion
from syscolumns C, sysobjects O, systypes T 
where (C.collation is not null) and C.id = O.id and c.TYPE = T.TYPE AND
C.XUSERTYPE = T.XUSERTYPE AND o.type = 'U'  
ORDER BY O.NAME;

OPEN micursor
FETCH NEXT FROM micursor INTO @var1
WHILE(@@FETCH_STATUS = 0 ) 
BEGIN
  --codigo transact sql
  --select @var1
  exec(@var1)
  
  FETCH NEXT FROM micursor INTO @var1
END
CLOSE micursor
DEALLOCATE micursor

Casimiro Notevi 03-03-2015 17:45:53

10 años después :D

Gracias, nunca es tarde :)


La franja horaria es GMT +2. Ahora son las 06:20:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi