Comment modifier le classement d'une base de données SQL Server?

16

J'essaie de standardiser toutes les bases de données sur un seul classement - Latin1_General_CI_AS (le classement standard). J'ai des bases de données qui se trouvent dans SQL_Latin1_General_CP1_CI_AS.

Je sais que je peux utiliser ALTER DATABASE pour modifier le classement de la base de données, mais cela n'affecte que les nouveaux objets. Ma compréhension est que la seule façon de modifier les colonnes existantes est de faire ALTER COLUMN sur chaque colonne de chaque table - et je devrais supprimer et recréer tous les index pour faire même cela.

Je suppose que cela ressemblerait à quelque chose comme ceci:

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)

et répétez l'opération pour chaque colonne varchar, char, text, nvarchar, nchar et ntext de la base de données entière. Ce serait un énorme script SQL.

Existe-t-il un moyen plus simple de le faire, ou quelqu'un peut-il suggérer un moyen d'automatiser la création d'un script SQL pour le faire?

Richard Gadsden
la source

Réponses:

9

MS KB 325335 a des options sur la façon de procéder pour la base de données entière et toutes les colonnes.

Fondamentalement:

  1. Tables de base de données de script (avec nouveau classement)
  2. Données DTS / SSIS (surveillance du classement)
  3. Ajouter des contraintes
gbn
la source
2

Malheureusement, ce n'est pas une tâche facile dans SQL Server.

Vous pouvez utiliser un outil de script comme la comparaison SQL de Redgate pour vos objets de base de données existants (tables, procédures stockées, vues, etc.). Si vous n'avez pas de licence, vous pouvez utiliser un essai gratuit. Après avoir créé la nouvelle base de données avec le bon classement et reconstruit les objets à partir de votre script, vous pouvez exécuter SSIS pour transférer des données d'une base de données à une autre. Si vous avez beaucoup de données, utilisez l'insertion en bloc T-SQL.

Pour avoir le bon classement pour les futures bases de données sur ce serveur, vous pouvez modifier le classement par défaut sur le serveur. L'article MSDN suivant explique les modifications à l'aide des clauses COLLATE de ALTER DATABASE et ALTER TABLE:

Définition et modification du classement de la base de données (documentation en ligne de SQL Server 2008)

Vous pouvez modifier le classement de tout nouvel objet créé dans une base de données utilisateur à l'aide de la clause COLLATE de l' instruction ALTER DATABASE . Cette instruction ne modifie pas le classement des colonnes dans les tables définies par l'utilisateur existantes. Ceux-ci peuvent être modifiés à l'aide de la clause COLLATE de ALTER TABLE .

Lorsque vous modifiez le classement de la base de données, vous modifiez les éléments suivants:

  • Le classement par défaut de la base de données. Ce nouveau classement par défaut est appliqué à toutes les colonnes, types de données définis par l'utilisateur, variables et paramètres créés ultérieurement dans la base de données. Il est également utilisé lors de la résolution des identificateurs d'objet spécifiés dans les instructions SQL par rapport aux objets définis dans la base de données.
  • Toutes les colonnes char, varchar, text, nchar, nvarchar ou ntext des tables système sont remplacées par le nouveau classement.
  • Tous les paramètres char, varchar, text, nchar, nvarchar ou ntext existants et les valeurs de retour scalaires pour les procédures stockées et les fonctions définies par l'utilisateur sont modifiés pour le nouveau classement.
  • Les types de données système char, varchar, text, nchar, nvarchar ou ntext et tous les types de données définis par l'utilisateur en fonction de ces types de données système sont remplacés par le nouveau classement par défaut.
splattne
la source
1

En général, il n'est pas recommandé de le faire sur un serveur en direct. La dernière fois que j'ai regardé, cela n'a pas été officiellement pris en charge par Microsoft. Pour ce faire, dans la pratique, vous devez créer une nouvelle instance avec le bon classement et migrer la base de données vers celle-ci.

La restauration d'une base de données avec un serveur avec un classement par défaut différent provoque toutes sortes de plaisir car tempdb aura le classement du nouveau serveur, donc ce n'est pas non plus recommandé.

ConcernedOfTunbridgeWells
la source
1

Essayez cet utilitaire qui, étant donné une base de données source, générera tous les scripts nécessaires à appliquer sur une base de données cible afin que le classement soit modifié en toute sécurité.

Manea Florin
la source
1

Vous pouvez utiliser les vues Infomation_Schema pour générer un script assez facilement, mais je ne suis pas sûr que ce soit la meilleure façon de résoudre votre problème. Recréer tous les index sur une base de données volumineuse pourrait prendre énormément de temps / espace de journalisation, etc. J'irais avec la migration (pas la restauration) vers une nouvelle instance.

Dave Jackson
la source