J'ai une base de données ( SQL Server 2005 code>) où il existe des dizaines de tables code>, chacune d'un certain nombre de colonnes code> (code> (sur moyenne 10-20) avec DataType défini sur NvarchaRar (max) code>. Ceci est absolument tuant des performances (certaines de ces colonnes sont utilisées pour jointures code> et certaines des tables ont 100 000 rangées). Je voudrais changer toutes ces colonnes pour être Varchar (250) Code>. Quel serait le meilleur moyen d'automatiser cela? (Je pourrais utiliser Gestion Studio Code> ou pour que je puisse créer un utilitaire pour effectuer cette option via un site Web ASP.NET CODE> ASP.NET CODE> ACCÈS AUX DB, selon la suivante: p>
3 Réponses :
Je pense que la meilleure façon de faire cette tâche est de générer un script pour la base de données actuelle, puis de remplacer Nvarchar (max) avec Varchar (250) sur le fichier texte, puis créez la nouvelle base de données. Après cela, utilisez les utilitaires d'importation / exportation pour transférer les données dans la nouvelle base de données. P>
Cela ne fonctionne pas - SSIS renvoie un message d'erreur indiquant que les métadonnées de la colonne ne correspondent pas entre les tables source et de destination.
Vous pouvez facilement les trouver, à l'aide de: alors prenez simplement les résultats de votre requête et exécutez-le. P> Rob P> P> >
Peut-être aussi la peine d'être mentionné ... Si vous mettez déclarez déclarez @qry Nvarchar (max) et sélectionnez @qry = (.... pour le chemin XML ('')); EXEC SP_EXECUTSQL @QRY; --Vous pouvez tout faire en une étape. Le .... est la requête actuelle que j'ai. Mais alors vous ne pouvez pas «vérifier la santé de la santé mentale» si bien.
Avez-vous besoin de prendre la nullabilité de la colonne en compte? Ces modifications seront-elles nullables car elle ne spécifie pas de la voie?
Voici un script de travail utilisant informations_schema.columns code> pour trouver tous les colonnes * varchar (max) code> et les convertit sur varchar (255) Code>: declare @schema nvarchar(255)
declare @table nvarchar(255)
declare @col nvarchar(255)
declare @dtype nvarchar(255)
declare @sql nvarchar(max)
declare maxcols cursor for
select
c.TABLE_SCHEMA,
c.TABLE_NAME,
c.COLUMN_NAME,
c.DATA_TYPE
from
INFORMATION_SCHEMA.COLUMNS c
inner join INFORMATION_SCHEMA.TABLES t on
c.TABLE_CATALOG = t.TABLE_CATALOG
and c.TABLE_SCHEMA = t.TABLE_SCHEMA
and c.TABLE_NAME = t.TABLE_NAME
and t.TABLE_TYPE = 'BASE TABLE'
where
c.DATA_TYPE like '%varchar'
and c.CHARACTER_MAXIMUM_LENGTH = -1
open maxcols
fetch next from maxcols into @schema, @table, @col, @dtype
while @@FETCH_STATUS = 0
begin
set @sql = 'alter table [' + @schema + '].[' + @table +
'] alter column [' + @col + '] ' + @dtype + '(255)'
exec sp_executesql @sql
fetch next from maxcols into @schema, @table, @col, @dtype
end
close maxcols
deallocate maxcols
Cela ne fonctionne pas parfaitement car il apporte également des colonnes à partir de vues
Maintenant, comment abandonner les contraintes et les remettre en le faisant, car nous ne pouvons pas modifier les cols avec une contrainte en place?
Que diriez-vous d'inclure une vérification pour s'appliquer uniquement aux colonnes avec une longueur maximale <255 afin qu'aucune donnée n'est potentiellement tronquée?