Comment changer le classement SQL Server

27

Comment pourrais-je changer le classement par défaut de SQL Server 2008 R2 Express pour l'ensemble du serveur et une base de données particulière?

Existe-t-il un moyen de le faire en utilisant l'interface visuelle de SQL Server Management Studio? Dans la fenêtre Propriétés du serveur (et dans la fenêtre Propriétés de la base de données correspondante), cette propriété n'est pas disponible pour modification.

rem
la source
2
Si vous souhaitez modifier le classement de toutes les colonnes de la base de données, consultez ce script . Je ne l'ai pas essayé moi-même, mais je l'ai trouvé pour un collègue qui cherchait à faire exactement cela.
Justin Dearing
2
Si vous souhaitez modifier le classement d'une base de données, consultez cet outil: codeproject.com/KB/database/ChangeCollation.aspx Il fonctionne avec SQL Server 2005 et 2008 et a mieux fonctionné pour moi que les scripts que vous pouvez trouver sur le Web.
Erwin

Réponses:

25

Oui.

Vous pouvez modifier le classement par défaut de l'instance express SQL Server 2008 R2 et des bases de données individuelles, mais c'est une tâche complexe.

Malheureusement, il n'y a pas d'option visuelle pour le faire via SSMS.

SQL Server 2008 prend en charge la définition de classements aux niveaux suivants:

  • Serveur

  • Base de données

  • Colonne

  • Expression

Les paramètres d'installation par défaut sont déterminés par les paramètres régionaux du système Windows. Le classement au niveau du serveur peut être modifié lors de l'installation ou en modifiant les paramètres régionaux du système Windows avant l'installation. plus...

Définition et modification du classement du serveur - SQL Server 2008

  • Assurez-vous que vous disposez de toutes les informations ou scripts nécessaires pour recréer vos bases de données utilisateur et tous les objets qu'elles contiennent.

  • Exportez toutes vos données à l'aide d'un outil tel que l'utilitaire bcp. Pour plus d'informations, voir Importation et exportation de données en masse.

  • Supprimez toutes les bases de données utilisateur.

  • Reconstruisez la base de données master en spécifiant le nouveau classement dans la propriété SQLCOLLATION de la commande setup

  • Créez toutes les bases de données et tous les objets qu'elles contiennent.

  • Importez toutes vos données.

Définition et modification du classement de la base de données - SQL Server 2008

  • Définissez l' COLLATIONoption dans l' CREATE DATABASEinstruction lors de la création d'une nouvelle base de données.
  • De même, définissez les COLLATIONoptions dans l' ALTER DATABASEinstruction pour modifier le classement d'une base de données existante.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Définition et modification du classement des colonnes

  • Certains des classements de colonnes resteront les mêmes même après avoir modifié le classement de la base de données. Dans ce cas, vous devez modifier le classement des colonnes individuelles.
CoderHawk
la source
6

Assurez-vous que vous voulez vraiment "supprimer" les bases de données utilisateur comme indiqué dans la réponse ci-dessus. Vous voudrez peut-être simplement «détacher» les bases de données. Ou vraiment, vous ne pouvez rien faire car la reconstruction du maître supprime efficacement tous les liens vers les bases de données utilisateur. Il y a des moments où les bases de données sont créées dans le classement souhaité, mais pas le serveur. Dans ce cas, vous ne voudriez pas avoir à récupérer toutes vos bases de données utilisateur à partir de sauvegardes.

AndrewSQL
la source
5

J'ai fait quelque chose comme ça et cela a fonctionné, mais vous devez garder à l'esprit les index qui pointent vers le type de données car text / varchar / nvarchar doivent être supprimés, exécutez le script puis créez les index.

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 

c'est ma première réponse posté pardon mon bordel

Jeffry
la source
-1

L'exportation de toutes les données (y compris les connexions, les serveurs liés, les travaux de l'Agent SQL, les paramètres de la messagerie DB, etc.) et la reconstruction des données au niveau de l'instance, ainsi que le rechargement de toutes les données utilisateur, demandent beaucoup de travail. Et, même après tout cela, il n'y a toujours aucune garantie que vous pouvez mettre à jour le classement par défaut d'une base de données via, ALTER DATABASEcar plusieurs conditions empêcheront l'opération de se terminer (veuillez consulter la section «Modification duALTER DATABASE classement de la base de données » de la documentation pour plus de détails) .

Il existe cependant une méthode non documentée qui est beaucoup plus simple. Le principal inconvénient étant qu'il n'est pas pris en charge. Cela ne veut pas dire que quelque chose ira mal, juste que si quelque chose se produit, Microsoft n'aidera pas à le réparer (car ils n'ont jamais garanti que cela fonctionnerait).

La méthode dont je parle fonctionne sqlservr.exeavec le -q {new_collation_name}commutateur. Il y a un peu plus que cela, mais c'est l'idée de base. Cette méthode met simplement à jour les métadonnées du système, ce qui a des avantages et des conséquences, les principaux étant:

AVANTAGES

  • assez rapide
  • contourner la plupart des restrictions qui empêchent ALTER DATABASEde travailler
  • probablement beaucoup plus précis que tout script que les gens ont imaginé au fil des ans pour supprimer et recréer des objets

DÉSAVANTAGES

  • non pris en charge en cas de problème
  • VARCHARles données peuvent changer, SI la page de codes est différente entre l'ancien et le nouveau classement, et des caractères avec des valeurs de 128 à 255 (0x80 - 0xFF) existent, et ces caractères n'existent pas comme le même caractère avec la même valeur sur le nouveau code page. Le risque de perte de données existe donc et vos données doivent d'abord être recherchées pour vous assurer que cette condition n'existe pas. Mais cela signifie également qu'il existe de nombreux cas avec uniquement des caractères ayant des valeurs de 0 à 127 qui ne sont pas en danger, même si la page de code change.
  • Les types de table définis par l'utilisateur (UDTT) sont ignorés et doivent être mis à jour manuellement.

Pour une description détaillée de ce que la sqlservr.exe -qméthode fait et ne fait pas (y compris des détails sur le fonctionnement des classements aux différents niveaux et les problèmes potentiels à surveiller), veuillez consulter mon article:

Modification du classement de l'instance, des bases de données et de toutes les colonnes dans toutes les bases de données utilisateur: qu'est-ce qui pourrait mal tourner?

Pour modifier uniquement l'instance (y compris les bases de données du système: master, model, msdbet tempdb) et une ou plusieurs bases de données (mais pas toutes les bases de données), il suffit de détacher la base de données (s) que vous souhaitez exclure de cette opération, puis les remettre en place une fois la mise à jour du classement terminée.

Solomon Rutzky
la source