¿Cómo cambio la intercalación de una base de datos de SQL Server?

16

Estoy tratando de estandarizar todas las bases de datos en una sola clasificación: Latin1_General_CI_AS (la clasificación estándar). Tengo algunas bases de datos que están en SQL_Latin1_General_CP1_CI_AS.

Sé que puedo usar ALTER DATABASE para cambiar la clasificación de la base de datos, pero eso solo afecta a los objetos nuevos. Tengo entendido que la única forma de cambiar las columnas existentes es ALTERAR COLUMNA en cada columna de cada tabla, y necesitaría eliminar y recrear todos los índices para hacer eso.

Supongo que se vería así:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

y repita para cada columna varchar, char, text, nvarchar, nchar y ntext en toda la base de datos. Eso sería un enorme script SQL.

¿Hay una manera más fácil de hacer esto, o alguien puede sugerir una forma de automatizar la creación de un script SQL para hacerlo?

Richard Gadsden
fuente

Respuestas:

9

MS KB 325335 tiene opciones sobre cómo hacer esto para toda la base de datos y todas las columnas.

Básicamente:

  1. Tablas de bases de datos de script (con nueva clasificación)
  2. Datos DTS / SSIS (ver intercalación)
  3. Agregar restricciones
gbn
fuente
2

Lamentablemente, esta no es una tarea fácil en SQL Server.

Puede usar una herramienta de secuencias de comandos como Redgate's SQL Compare para sus objetos de base de datos existentes (tablas, procedimientos almacenados, vistas, etc.) Si no tiene una licencia, puede usar una versión de prueba gratuita. Después de crear la nueva base de datos con la clasificación correcta y reconstruir los objetos de su script, puede ejecutar SSIS para transferir datos de una base de datos a otra. Si tiene muchos datos, use la inserción masiva de T-SQL.

Para tener la clasificación correcta para futuras bases de datos en ese servidor, puede cambiar la clasificación predeterminada en el servidor. El siguiente artículo de MSDN explica qué cambios se utilizan con las cláusulas COLLATE de ALTER DATABASE y ALTER TABLE:

Establecer y cambiar la clasificación de la base de datos (Libros en pantalla de SQL Server 2008)

Puede cambiar la intercalación de cualquier objeto nuevo que se cree en una base de datos de usuario utilizando la cláusula COLLATE de la instrucción ALTER DATABASE . Esta declaración no cambia la clasificación de las columnas en ninguna tabla definida por el usuario existente. Estos se pueden cambiar utilizando la cláusula COLLATE de ALTER TABLE .

Cuando cambia la clasificación de la base de datos, cambia lo siguiente:

  • La clasificación predeterminada para la base de datos. Esta nueva clasificación predeterminada se aplica a todas las columnas, tipos de datos definidos por el usuario, variables y parámetros creados posteriormente en la base de datos. También se usa cuando se resuelven los identificadores de objeto especificados en las sentencias SQL contra los objetos definidos en la base de datos.
  • Cualquier columna char, varchar, text, nchar, nvarchar o ntext en las tablas del sistema se cambia a la nueva clasificación.
  • Todos los parámetros char, varchar, text, nchar, nvarchar o ntext existentes y los valores de retorno escalar para procedimientos almacenados y funciones definidas por el usuario se cambian a la nueva clasificación.
  • Los tipos de datos del sistema char, varchar, text, nchar, nvarchar o ntext, y todos los tipos de datos definidos por el usuario basados ​​en estos tipos de datos del sistema, se cambian a la nueva clasificación predeterminada.
splattne
fuente
1

En general, no se recomienda hacer esto a un servidor en vivo. La última vez que miré, hacer esto no fue oficialmente compatible con Microsoft. Para hacer esto en la práctica, debe crear una nueva instancia con la clasificación correcta y migrar la base de datos a ella.

La restauración de una base de datos con un servidor con una clasificación predeterminada diferente causa todo tipo de diversión, ya que tempdb tendrá la clasificación del nuevo servidor, por lo que tampoco se recomienda.

Preocupado por TunbridgeWells
fuente
1

Pruebe esta utilidad , que dada una base de datos de origen generará todos los scripts necesarios para ser aplicados en una base de datos de destino para que la intercalación se cambie de forma segura.

Manea Florin
fuente
1

Puede usar las vistas Infomation_Schema para generar un script con bastante facilidad, pero no estoy seguro de que esta sea la mejor manera de resolver su problema. Volver a crear todos los índices en una base de datos grande podría tomar una enorme cantidad de tiempo / espacio de registro, etc. Iría con migrar (no restaurar) a una nueva instancia.

Dave Jackson
fuente