Cómo cambiar la intercalación de SQL Server

27

¿Cómo podría cambiar la Clasificación predeterminada de SQL Server 2008 R2 Express para todo el servidor y una base de datos en particular?

¿Hay alguna manera de hacerlo usando la interfaz visual de SQL Server Management Studio? En la ventana Propiedades del servidor (y en la ventana Propiedades de la base de datos correspondiente), esta propiedad no está disponible para edición.

movimiento rápido del ojo
fuente
2
Si desea cambiar la clasificación de todas las columnas de la base de datos, mire este script . No lo he probado yo mismo, pero lo encontré para un compañero de trabajo que estaba buscando hacer eso.
Justin Dearing
2
Si desea cambiar la clasificación de una base de datos, consulte esta herramienta: codeproject.com/KB/database/ChangeCollation.aspx Funciona con SQL Server 2005 y 2008 y me ha funcionado mejor que los scripts que puede encontrar en el web.
Erwin

Respuestas:

25

Sí.

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

Lamentablemente, no hay 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 intercalació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 clasificació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 en ellas.

  • Exporte todos sus datos utilizando una herramienta como la utilidad bcp. Para obtener más información, consulte Importar y exportar datos en masa.

  • Descarte todas las bases de datos de usuarios.

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

  • Cree todas las bases de datos y todos los objetos en ellas.

  • Importa todos tus datos.

Configuración y cambio de la clasificación de la base de datos - SQL Server 2008

  • Establezca la COLLATIONopción en la CREATE DATABASEdeclaración mientras crea una nueva base de datos.
  • Del mismo modo, configure las COLLATIONopciones en la ALTER DATABASEinstrucción para cambiar la recopilación de una base de datos existente.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Establecer y cambiar la clasificación de columnas

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

Asegúrese de que realmente quiere "soltar" las bases de datos de usuario como se indica en la respuesta anterior. Es posible que solo desee "separar" las bases de datos. O, en realidad, no puede hacer nada, ya que la reconstrucción del maestro elimina efectivamente los enlaces a las bases de datos de los usuarios. Hay momentos en que las bases de datos se crean en la clasificación deseada pero el servidor no. No querría tener que recuperar todas sus bases de datos de usuarios de las copias de seguridad en este caso.

AndrewSQL
fuente
5

Hice algo como esto y funcionó, pero debe tener en cuenta que los índices que apuntan al tipo de datos como text / 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 desastre

Jeffry
fuente
-1

Exportar todos los datos (incluidos los inicios de sesión, los servidores vinculados, los trabajos del Agente SQL, la configuración de DB Mail, etc.) y reconstruir los datos a nivel de instancia, además de volver a cargar todos los datos del usuario, es mucho trabajo. E, incluso después de todo eso, todavía no hay garantía de que pueda actualizar la clasificación predeterminada de una base de datos a través de ALTER DATABASEporque hay varias condiciones que evitarán que la operación se complete (consulte la sección "Cambiar la clasificación de la base de datos" de la ALTER DATABASEdocumentación para más detalles) .

Sin embargo, hay un método indocumentado que es mucho más fácil. El principal inconveniente es que no es compatible. Esto no quiere decir que algo salga mal, solo que si algo sucede, Microsoft no ayudará a solucionarlo (porque nunca garantizaron que funcionaría).

El método del que hablo se ejecuta sqlservr.execon el -q {new_collation_name}interruptor. Hay un poco más que eso, pero esa es la idea básica. Este método simplemente actualiza los metadatos del sistema, lo que tiene beneficios y consecuencias, siendo los principales:

Beneficios

  • muy rápido
  • omitir la mayoría de las restricciones que impiden ALTER DATABASE funcione
  • probablemente mucho más preciso que cualquier script que la gente haya creado a lo largo de los años para soltar y recrear objetos

DIBUJOS

  • sin soporte si algo sale mal
  • VARCHARlos datos pueden cambiar, SI la página de códigos es diferente entre las colaciones antiguas y nuevas, y existen caracteres con valores de 128 - 255 (0x80 - 0xFF), y esos caracteres no existen como el mismo carácter con el mismo valor en el nuevo código página. Por lo tanto, existe la posibilidad de pérdida de datos, y sus datos deben investigarse primero para garantizar que esta condición no exista. Pero, esto también significa que hay muchos casos con solo caracteres que tienen valores de 0 a 127 que no están en peligro, incluso si la página de códigos cambia.
  • Los tipos de tabla definidos por el usuario (UDTT) se omiten y deben actualizarse manualmente.

Para obtener una descripción detallada de lo sqlservr.exe -qque hace y no hace el método (incluidos los detalles sobre cómo funcionan las colaciones en los distintos niveles y los posibles problemas a tener en cuenta), consulte mi publicación:

Cambio de la clasificación de la instancia, las bases de datos y todas las columnas en todas las bases de datos de usuario: ¿qué podría salir mal?

Para cambiar sólo la instancia (incluyendo las bases de datos del sistema: master, model, msdb, y tempdb) y una o más bases de datos (pero no todas las bases de datos), sólo tienes que separar la base de datos (s) que desea excluir de esta operación, y luego vuelva a conectar ellas una vez que se completa la actualización de colación.

Solomon Rutzky
fuente