220 votes

Comment ALTER plusieurs colonnes à la fois dans SQL Server

J'ai besoin de MODIFIER les types de données de plusieurs colonnes dans une table.

Pour une seule colonne, le code suivant fonctionne bien :

ALTER TABLE tblcommodityOHLC
ALTER COLUMN
    CC_CommodityContractID NUMERIC(18,0) 

Mais comment modifier plusieurs colonnes en une seule instruction ? Le code suivant ne fonctionne pas :

ALTER TABLE tblcommodityOHLC
ALTER COLUMN
    CC_CommodityContractID NUMERIC(18,0), 
    CM_CommodityID NUMERIC(18,0)

1 votes

Quel est l'avantage perçu de le faire en une seule fois?

11 votes

@onedaywhen - Ainsi, SQL Server ne ferait qu'un seul passage à travers la table pour effectuer toute validation nécessaire contre le nouveau type de données et/ou écrire les colonnes modifiées dans le nouveau format.

8 votes

Contrairement. Ce serait un grand avantage d'avoir une alternative exécutée en 2 heures au lieu de 24 pour plusieurs colonnes sur de grandes tables.

185voto

Neil Knight Points 23759

C'est impossible. Vous devrez le faire un par un. Vous pourriez :

  1. Créer une table temporaire avec vos colonnes modifiées
  2. Copier les données
  3. Supprimer votre table originale (Vérifiez bien avant !)
  4. Renommer votre table temporaire avec votre nom d'origine

8 votes

+1, Vous devrez le faire un par un., alors, quel est le problème, il suffit d'utiliser plusieurs commandes ALTER TABLE ALTER COLUMN ?

13 votes

@KM Un problème est si vous modifiez une grande table. Chaque instruction signifie une nouvelle analyse mais si vous pouviez modifier plusieurs colonnes, toutes les modifications pourraient être beaucoup plus rapides

0 votes

@erikkallen, puis faites comme le font généralement les outils SSMS pour générer leurs scripts : créez une nouvelle table et répliquez les FKs et indexes, etc., supprimez la table originale puis renommez la nouvelle table.

61voto

Fernando Torres Points 41

Faire plusieurs actions ALTER COLUMN à l'intérieur d'une seule instruction ALTER TABLE n'est pas possible.

Voir la syntaxe de ALTER TABLE ici

Vous pouvez effectuer plusieurs ADD ou plusieurs DROP COLUMN, mais seulement un ALTER COLUMN.

45voto

Ray K. Points 361

Comme l'ont déjà répondu d'autres, vous avez besoin de plusieurs instructions ALTER TABLE.
Essayez ce qui suit :

ALTER TABLE tblcommodityOHLC modifier la colonne CC_CommodityContractID NUMERIC(18,0);
ALTER TABLE tblcommodityOHLC modifier la colonne CM_CommodityID NUMERIC(18,0);

0 votes

À l'aide de la fonction copier-coller + fenêtre sous SSMS ou même Notepad++, vous pouvez lister vos colonnes et nouveaux types ou contraintes, et ajouter ALTER TABLE x ALTER COLUMN à chaque colonne qui a besoin de modification. Cela peut sembler kitsch, mais c'était également le cas d'avoir une spécification de table aussi déréglée en premier lieu.

14voto

Pritam Points 192

La solution suivante n'est pas une seule déclaration pour modifier plusieurs colonnes, mais oui, elle simplifie la vie:

  1. Générer le script CREATE d'une table.

  2. Remplacer CREATE TABLE par ALTER TABLE [NomTable] ALTER COLUMN pour la première ligne.

  3. Supprimer les colonnes non désirées de la liste.

  4. Modifier les types de données des colonnes comme vous le souhaitez.

  5. Effectuer une Recherche et Remplacement… comme suit:

    1. Rechercher : NULL,
    2. Remplacer par : NULL; ALTER TABLE [NomTable] ALTER COLUMN
    3. Appuyer sur le bouton Remplacer.
  6. Exécuter le script.

En espérant que cela vous fera gagner beaucoup de temps :))

11voto

Evan Points 92

Comme beaucoup l'ont dit, vous devrez utiliser plusieurs ALTER COLUMN déclarations, une pour chaque colonne que vous souhaitez modifier.

Si vous souhaitez modifier toutes ou plusieurs des colonnes de votre table vers le même datatype (tel que l'extension d'un champ VARCHAR de 50 à 100 caractères), vous pouvez générer toutes les déclarations automatiquement en utilisant la requête ci-dessous. Cette technique est également utile si vous souhaitez remplacer le même caractère dans plusieurs champs (comme supprimer \t de toutes les colonnes).

SELECT
     TABLE_CATALOG
    ,TABLE_SCHEMA
    ,TABLE_NAME
    ,COLUMN_NAME
    ,'ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ALTER COLUMN ['+COLUMN_NAME+'] VARCHAR(300)' as 'code'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'votre_table' ET TABLE_SCHEMA = 'votre_schema'

Cela génère une déclaration ALTER TABLE pour chaque colonne pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X