Saltar al contenido

Cómo cambiar la intercalación de SQL Server

Posterior a investigar con especialistas en esta materia, programadores de deferentes áreas y maestros hemos dado con la solución al dilema y la dejamos plasmada en este post.

Solución:

Si.

Puede cambiar la intercalación predeterminada de la instancia rápida de SQL Server 2008 R2 y las bases de datos individuales, pero es una tarea compleja.

Lamentablemente, no existe una opción visual para hacerlo a través de SSMS.

SQL Server 2008 admite la configuración de intercalaciones en los siguientes niveles:

  • Servidor

  • Base de datos

  • Columna

  • Expresión

La configuración de instalación predeterminada está determinada por la configuración regional del sistema de Windows. La clasificación a nivel de servidor se puede cambiar durante la instalación o cambiando la configuración regional del sistema de Windows antes de la instalación. más…

Configuración y cambio de la intercalación del servidor – SQL Server 2008

  • Asegúrese de tener toda la información o los scripts necesarios para volver a crear sus bases de datos de usuario y todos los objetos que contienen.

  • Exporta todos tus datos usando una herramienta como bcp Utility. Para obtener más información, consulte Importación y exportación de datos masivos.

  • Elimina todas las bases de datos de los usuarios.

  • Reconstruir la base de datos maestra especificando la nueva intercalación en la propiedad SQLCOLLATION del comando de configuración

  • Crea todas las bases de datos y todos los objetos que contienen.

  • Importa todos tus datos.

Configuración y cambio de la intercalación de la base de datos – SQL Server 2008

  • Selecciona el COLLATION opción en el CREATE DATABASE declaración al crear una nueva base de datos.

  • Del mismo modo, establezca el COLLATION opciones en el ALTER DATABASE declaración para cambiar la intercalación de una base de datos existente.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Configuración y cambio de la clasificación de columnas

  • Algunas de las intercalaciones de columnas seguirán siendo las mismas incluso después de modificar la intercalación de la base de datos. En ese caso, debe modificar la clasificación de las columnas individuales.

Asegúrese de que realmente desea “eliminar” las bases de datos de los usuarios como se indica en la respuesta anterior. Es posible que desee “separar” las bases de datos. O, en realidad, no puede hacer nada, ya que la reconstrucción del maestro elimina de forma eficaz los enlaces a las bases de datos de los usuarios. Hay ocasiones en las que las bases de datos se crean en la intercalación deseada, pero el servidor no. En este caso, no querrá tener que recuperar todas las bases de datos de sus usuarios a partir de copias de seguridad.

Hice algo como esto y funcionó, pero debe tener en cuenta que los índices que apuntan al tipo de datos como texto / varchar / nvarchar deben eliminarse, ejecutar el script y luego crear los índices.

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 

esta es mi primera respuesta publicada perdón mi lío

Sección de Reseñas y Valoraciones

Recuerda algo, que tienes autorización de agregar una reseña si encontraste tu incógnita a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *