2008-10-07 5 views
9

Je suis dans une situation où je dois mettre à jour une structure de base de données existante de varchar à nvarchar en utilisant un script. Étant donné que ce script est exécuté chaque fois qu'une application de configuration est exécutée, je préférerais déterminer si une colonne a déjà été modifiée en nvarchar et ne pas effectuer d'altération sur la table. Les bases de données que je doit prendre en charge sont SQL Server 2000, 2005 et 2008.SQL Server - script pour mettre à jour les colonnes de base de données de varchar à nvarchar si pas déjà nvarchar

Répondre

2

La requête suivante devrait vous obtenir ce dont vous avez besoin:

IF EXISTS 
    (SELECT * 
    FROM sysobjects syo 
    JOIN syscolumns syc ON 
    syc.id = syo.id 
    JOIN systypes syt ON 
    syt.xtype = syc.xtype 
    WHERE 
    syt.name = 'nvarchar' AND 
    syo.name = 'MY TABLE NAME' AND 
    syc.name = 'MY COLUMN NAME') 
BEGIN 
    ALTER ... 
END 
26

Vous pouvez exécuter le script suivant qui vous donnera un ensemble de ALTER commandes:

SELECT 'ALTER TABLE ' + isnull(schema_name(syo.id), 'dbo') + '.' + syo.name 
    + ' ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.length when -1 then 'MAX' 
     ELSE convert(nvarchar(10),syc.length) end + ');' 
    FROM sysobjects syo 
    JOIN syscolumns syc ON 
    syc.id = syo.id 
    JOIN systypes syt ON 
    syt.xtype = syc.xtype 
    WHERE 
    syt.name = 'varchar' 
    and syo.xtype='U' 

Il y a cependant quelques rapides mises en garde pour vous.

  1. Ceci fera seulement des tableaux. Vous voudrez scanner tous vos sprocs et fonctions pour vous assurer qu'ils sont également remplacés par NVARCHAR.
  2. Si vous avez un VARCHAR> 4000, vous devrez le modifier pour être NVARCHAR(MAX)

Mais ceux-ci devraient être facilement réalisable avec ce modèle.

Si vous voulez que cela s'exécute automagiquement, vous pouvez le définir dans une clause WHILE.

+0

Cela a fonctionné à merveille pour moi. Super petit script! – DanM

+4

Faites attention car vous obtiendrez toutes les valeurs par défaut pour une nouvelle colonne. Par exemple, un varchar non nul sera créé en tant que nvarchar Nullable. –

2

Correction du problème de l'espace et ajouté schéma

SELECT 'ALTER TABLE [' + isnull(schema_name(syo.object_id), sysc.name) + '].[' + syo.name 
    + '] ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.max_length when -1 then 'MAX' 
     ELSE convert(nvarchar(10),syc.max_length) end + ');' 
    FROM sys.objects syo 
    JOIN sys.columns syc ON 
    syc.object_id= syo.object_id 
    JOIN sys.types syt ON 
    syt.system_type_id = syc.system_type_id 
    JOIN sys.schemas sysc ON 
    syo.schema_id=sysc.schema_id 
    WHERE 
    syt.name = 'varchar' 
    and syo.type='U' 
4

Le problème avec la réponse de Josef est que cela changerait NOT NULL champs à NULL après l'exécution des requêtes. La manipulation suivante il fixe:

SELECT cmd = 'alter table [' + c.table_schema + '].[' + c.table_name 
+ '] alter column [' + c.column_name + '] nvarchar(' 
+CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000 
     THEN CAST(CHARACTER_MAXIMUM_LENGTH as varchar(10)) ELSE 'max' END+')' 
+ CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END,* 
FROM information_schema.columns c 
WHERE c.data_type='varchar' 
ORDER BY CHARACTER_MAXIMUM_LENGTH desc 

Crédits à Igor's answer

Questions connexes