33 votes

Mettre à jour le classement de tous les champs de la base de données à la volée

Nous avons récemment déménagé notre base de données de notre Serveur SQL server 2005 pour de notre Serveur SQL server 2008. Tout déménagé plus de bien, mais nous constatons maintenant que nous sommes classement des conflits. L'ancien serveur a eu un classement différent avec le nouveau serveur.

Maintenant, tables créées avant le déménagement, qui sont d'un classement, et celles créées après sont un autre classement.

Est-il un moyen de mettre à jour les tables/colonnes avec l'ancien classement pour le classement de nouveau?

Je comprends le réglage par défaut de la base de données/serveur de classement ne pas modifier les tables existantes (lien). Je ne veux vraiment pas à recréer la base de données si je n'ai pas d'.

Toute aide vraiment apprécié.

Merci pour votre aide les gars, a finalement obtenu ce travail.

Pour référence, voici mon script final:

SELECT 'ALTER TABLE [' + SYSOBJECTS.Name + '] ALTER COLUMN [' + SYSCOLUMNS.Name + '] ' +
SYSTYPES.name + 
    CASE systypes.NAME
    WHEN 'text' THEN ' '
    ELSE
    '(' + RTRIM(CASE SYSCOLUMNS.length
    WHEN -1 THEN 'MAX'
    ELSE CONVERT(CHAR,SYSCOLUMNS.length)
    END) + ') ' 
    END

    + ' ' + ' COLLATE Latin1_General_CI_AS ' + CASE ISNULLABLE WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
    FROM SYSCOLUMNS , SYSOBJECTS , SYSTYPES
    WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID
    AND SYSOBJECTS.TYPE = 'U'
    AND SYSTYPES.Xtype = SYSCOLUMNS.xtype
    AND SYSCOLUMNS.COLLATION IS NOT NULL
    AND NOT ( sysobjects.NAME LIKE 'sys%' )
    AND NOT ( SYSTYPES.name LIKE 'sys%' )
    GO

Voici le site qui contient le script, je me suis basé sur. J'ai dû le modifier pour qu'il fonctionne correctement.

11voto

kent Points 61

Juste au cas où quelqu'un qui regarde cela utilise SQL Server 2008, j'ai dû faire quelques modifications:

 SELECT 'ALTER TABLE [' + sys.objects.name + '] ALTER COLUMN ['
+ sys.columns.name + '] ' + sys.types.name + 
    CASE sys.types.name
    WHEN 'text' THEN ' '
    ELSE
    '(' + RTRIM(CASE sys.columns.max_length
    WHEN -1 THEN 'MAX'
    ELSE CONVERT(CHAR,sys.columns.max_length)
    END) + ') ' 
    END

    + ' ' + ' COLLATE Latin1_General_BIN ' + CASE sys.columns.is_nullable WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
    FROM sys.columns , sys.objects , sys.types
    WHERE sys.columns.object_id = sys.objects.object_id
    AND sys.objects.TYPE = 'U'
    AND sys.types.system_type_id = sys.columns.system_type_id
    AND sys.columns.collation_name IS NOT NULL
    AND NOT ( sys.objects.NAME LIKE 'sys%' )
    AND NOT ( sys.types.name LIKE 'sys%' )
 

6voto

OMG Ponies Points 144785

Vous pouvez modifier le classement de tout nouveaux objets sont créés dans une base de données utilisateur à l'aide de la clause COLLATE de MODIFIER la BASE de données de l'énoncé. Cette déclaration n'est pas de modifier le classement des colonnes dans un tables définies par l'utilisateur. Ceux-ci peuvent être modifiées à l'aide de la clause COLLATE de l'instruction ALTER TABLE.

Référence: définition et la Modification du Classement de Base de données

Si il y a trop de colonnes, vous pouvez faire une boucle par SYS.Les COLONNES d'appliquer l'instruction ALTER TABLE.

5voto

Serge Fonville Points 11

Que diriez-vous:

 DECLARE @collation NVARCHAR(64)
SET @collation = 'Latin1_General_CI_AS'

SELECT
    'ALTER TABLE [' + TABLE_SCHEMA  + '].[' + TABLE_NAME + '] '
  + 'ALTER COLUMN [' + COLUMN_NAME + '] '
  + DATA_TYPE + '(' + CASE CHARACTER_MAXIMUM_LENGTH 
        WHEN -1 THEN 'MAX' 
        ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) END + ') '
  + 'COLLATE ' + @collation + ' '
  + CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
FROM INFORMATION_SCHEMA.columns
WHERE  COLLATION_NAME IS NOT NULL
AND COLLATION_NAME <> @collation
 

3voto

Ben Gripka Points 4885

Pour résoudre ce problème, vous avez besoin de beaucoup plus de puissance de feu alors ce script fournit. J'ai essayé le script et a couru dans des problèmes avec les objets dépendants ne pouvais pas mettre à jour: les index, les clés et les procédures. La solution finale a pris à peine 5 minutes avec ce projet de code d'application. L'application dit que c'est pour Sql Server 2000, mais je l'ai utilisé avec succès en 2008.

http://www.codeproject.com/Articles/12753/SQL-Server-2000-Collation-Changer

Je ne peux pas insister assez sur ce point. UNE SAUVEGARDE DE VOTRE BASE DE DONNÉES. J'ai dû utiliser ma sauvegarde trois fois pour terminer cette tâche.

2voto

Timothy Walters Points 8222

Une option est d'utiliser un programme comme Porte Rouge SQL Comparer (je suis sûr qu'il ya beaucoup d'autres aussi). Avec elle, vous pouvez générer des fichiers de script pour votre schéma avec le classement inclus (assurez-vous de tourner dans les options), puis faire un rechercher/remplacer dans les fichiers de mise à jour pour le nouveau classement, puis re-comparer les ramener à votre base de données réelle.

À ce stade, SQL de Comparer sera en mesure d'appliquer ces modifications (ou enregistrer les modifications dans un fichier de script si vous préférez), et vos colonnes existantes sont tous fixes.

En théorie, vous pourriez faire tout cela tout en demeurant dans la période d'essai, bien que je vous suggère c'est un bon outil pour garder autour d'elle effectue de nombreuses tâches SQL plus facile!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X