8
votes

Comment changer toutes les colonnes SQL d'un type de données en un autre

J'ai une base de données ( SQL Server 2005 ) où il existe des dizaines de tables , chacune d'un certain nombre de colonnes (code> (sur moyenne 10-20) avec DataType défini sur NvarchaRar (max) . Ceci est absolument tuant des performances (certaines de ces colonnes sont utilisées pour jointures et certaines des tables ont 100 000 rangées). Je voudrais changer toutes ces colonnes pour être Varchar (250) . Quel serait le meilleur moyen d'automatiser cela? (Je pourrais utiliser Gestion Studio ou pour que je puisse créer un utilitaire pour effectuer cette option via un site Web ASP.NET ASP.NET ACCÈS AUX DB, selon la suivante:


0 commentaires

3 Réponses :


0
votes

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.


1 commentaires

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.



3
votes

Vous pouvez facilement les trouver, à l'aide de: xxx

alors prenez simplement les résultats de votre requête et exécutez-le.

Rob >


2 commentaires

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?



11
votes

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


3 commentaires

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?