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
9
A
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.
- Ceci fera seulement des tableaux. Vous voudrez scanner tous vos sprocs et fonctions pour vous assurer qu'ils sont également remplacés par
NVARCHAR
. - Si vous avez un
VARCHAR
> 4000, vous devrez le modifier pour êtreNVARCHAR(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
.
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
Cela a fonctionné à merveille pour moi. Super petit script! – DanM
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. –