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
Questions connexes
- 1. Conversion de données de nvarchar en varchar en C#
- 2. Qu'est-ce que PostgreSQL est équivalent à SQL Server NVARCHAR?
- 3. Tailles NVARCHAR dans SQL Server 2005
- 4. SQL Server créer/mettre à jour le script de base de données
- 5. Mettre à jour les varchar en double pour être unique dans la base de données SQL
- 6. la taille des colonnes de base de données pour les données à base de caractères
- 7. Y at-il une raison pour laquelle je ne devrais pas utiliser NVARCHAR dans Sql Server?
- 8. Nvarchar ou varchar quoi de mieux utiliser multiplier 2 ou arrondir les nombres entiers?
- 9. SQL: comment comparer les valeurs de date dans les types de données nvarchar
- 10. Recherche dans Nvarchar (max)
- 11. sql server data data champs nvchar (x) ou nvarchar (max)
- 12. Pourquoi SQL Server nécessite que l'INT soit converti en NVARCHAR?
- 13. SQL Server, nvarchar (MAX) ou ntext, image ou varbinary?
- 14. jQuery - Si une base de données est mise à jour, mettre à jour la page
- 15. SQL Server 2000 - Valeur par défaut pour les champs varchar
- 16. LinqToSql .Contains et nvarchar vs paramètres varchar -> plan de conversion d'index
- 17. Mise à jour du script pour mettre à jour un champ de table de SQL Server de NULL à non-nul
- 18. Comment indiquer à linq to sql de mettre à jour les colonnes de la table avec leurs valeurs par défaut dans UpdateOnSubmit/SubmitChanges?
- 19. Si l'enregistrement existe dans la base de données, METTRE À JOUR une seule colonne
- 20. comment mettre à jour dataGrid dans la base de données
- 21. FluentNHibernate - Définition de la valeur par défaut pour les colonnes de base de données (SQL Server)
- 22. ASP.Net: Comment mettre à jour la base de données?
- 23. La modification du classement de la base de données ne met pas à jour le classement des champs varchar/text dans le DB (MS SQL)
- 24. Impossible de mettre à jour la table de SQL Server avec l'utilitaire BCP
- 25. Sql Server Ignorer les erreurs de mise à jour
- 26. La conversion d'une colonne de varchar en nvarchar modifie-t-elle le codage des chaînes stockées dans la colonne?
- 27. Convertir varchar à uniqueIdentifier dans SQL Server
- 28. mise à jour d'un champ de tous les tuples dans ma base de données (MS SQL)
- 29. Mise à jour d'une base de données dorsale sur la mise à jour logicielle avec Java
- 30. Les mappeurs O/R qui peuvent mettre à jour le schéma de base de données automatiquement?
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. –