Comment changer l'ordre des colonnes dans une table à l'aide d'une requête SQL dans SQL Server 2005?

109

Comment modifier l'ordre des colonnes dans une table à l'aide d'une requête SQL dans SQL Server 2005?

Je souhaite réorganiser l'ordre des colonnes dans une table à l'aide d'une requête SQL.

Himadri
la source
3
Si vous faites référence à la modification de la position des colonnes telles qu'elles existent dans la table, vous devrez créer une nouvelle table avec l'ordre préféré, insérer les données de l'ancienne table, puis supprimer la table d'origine. Il n'y a pas d'autre moyen (à ma connaissance) de faire cela.
Michael Todd
Parlez-vous de l'ordre des colonnes sur une instruction SELECT ou de l'ordre des colonnes sur la définition de table?
marc_s

Réponses:

112

Vous ne pouvez pas. L'ordre des colonnes est juste une chose «cosmétique» dont les humains se soucient - pour SQL Server, il est presque toujours absolument hors de propos.

Ce que SQL Server Management Studio fait en arrière-plan lorsque vous modifiez l'ordre des colonnes, recrée la table à partir de zéro avec une nouvelle CREATE TABLEcommande, copie les données de l'ancienne table, puis la supprime.

Il n'y a pas de commande SQL pour définir l'ordre des colonnes.

marc_s
la source
4
Non, il n'y a rien de tel ni SQL Server - et ne devrait pas être dans un RBDMS réel - l'ordre des colonnes n'est pas un concept pertinent pour une table SQL
marc_s
68
@marc_s Il n'y a pas de bonne raison de ne pas prendre en charge l'ordre des colonnes. Même si ce n'est que visuel. Cela peut simplement faciliter la visualisation des données dans une table avec un ordre de colonne donné lorsque vous effectuez un "SELECT *". Je suis développeur et je fais ce genre de requêtes tout le temps. Vous pouvez gagner du temps avec un bon ordre de colonne prédéfini. De tout autre point de vue, bien sûr, cela n'a aucun sens: rien ne doit dépendre de l'ordre des colonnes. En passant, il existe une colonne ORDINAL_POSITION qlorsque vous interrogez "INFORMATION_SCHEMA.COLUMNS". Je ne sais pas ce que ça veut dire ... mais ça doit avoir quelque chose à voir avec ça.
JotaBe
18
L'ordre des colonnes est pertinent, par exemple lors de l'utilisation de INSERT INTO sans spécifier de noms de colonnes. Un autre exemple est l'index de colonne ORDER BY au lieu du nom de la colonne. Ces deux pratiques ne sont évidemment pas recommandées, mais SQL Server le permet, donc quelqu'un l'a peut-être utilisé quelque part, cassant éventuellement le code T-SQL lors du changement de l'ordre des colonnes.
Carvellis
12
@Carvelis: vous ne devez JAMAIS utiliser INSERTsans spécifier explicitement vos colonnes de toute façon!
marc_s
2
@marc_s: absolument, mais je ne suis généralement pas le seul à travailler sur un projet. J'ai vu pas mal de projets où des gens ont utilisé ce type de code.
Carvellis
30

Vous devez répertorier explicitement les champs dans l'ordre dans lequel vous souhaitez qu'ils soient renvoyés au lieu d'utiliser * pour l'ordre «par défaut».

requête d'origine:

select * from foobar

Retour

foo bar
--- ---
  1   2

maintenant écris

select bar, foo from foobar

bar foo
--- ---
  2   1
Lexu
la source
La réponse ci-dessus est fausse, n'est-ce pas? Cette réponse montre littéralement comment ordonner les colonnes, pourquoi la précédente a-t-elle une coche et celle-ci non?
Agent Lu du
1
@Agent Lu Le problème est la formulation de la question initiale. Marc et moi avons interprété différemment la question du PO pour «changer l'ordre des colonnes». Il fait un argument fort pour lequel l'ordre des colonnes n'est pas pertinent dans la table stockée (les noms sont cependant). J'ai montré comment les données peuvent être extraites dans un ordre de colonne différent. Pas du tout la même chose!
lexu le
23

selon http://msdn.microsoft.com/en-us/library/aa337556.aspx

Cette tâche n'est pas prise en charge à l'aide d'instructions Transact-SQL.

Eh bien, cela peut être fait, en utilisant create/ copy / drop/ rename, comme répondu par komma8.komma1

Ou vous pouvez utiliser SQL Server Management Studio

  1. Dans l' Explorateur d'objets , cliquez avec le bouton droit sur la table avec les colonnes que vous souhaitez réorganiser et cliquez sur Conception (Modifier dans la version 2005 SP1 ou antérieure)
  2. Cochez la case à gauche du nom de la colonne que vous souhaitez réorganiser. (Vous pouvez sélectionner plusieurs colonnes en maintenant les touches [Maj] ou [Ctrl] de votre clavier.)
  3. Faites glisser la ou les colonnes vers un autre emplacement dans le tableau.

Cliquez ensuite sur Enregistrer. Cette méthode supprime et recrée la table, de sorte que des erreurs peuvent survenir.

Si l' option de suivi des modifications est activée pour la base de données et la table, vous ne devez pas utiliser cette méthode.

Si elle est désactivée, l' option Empêcher l'enregistrement des modifications nécessitant la recréation de la table doit être désactivée dans le menu Outils> Options> Concepteurs, sinon l' erreur «L'enregistrement des modifications n'est pas autorisé» se produira.

  • La désactivation de l' option Empêcher l'enregistrement des modifications nécessitant la recréation de la table est fortement déconseillée par Microsoft, car elle entraîne la suppression des informations de suivi des modifications existantes lorsque la table est recréée, vous ne devez donc jamais désactiver cette option si le suivi des modifications est activée!

Des problèmes peuvent également survenir lors de la création de clés primaires et étrangères.

Si l'une des erreurs ci-dessus se produit, l'enregistrement échoue, ce qui vous laisse avec l'ordre d'origine des colonnes.

robotik
la source
1
La déclaration " This task cannot be performed using Transact-SQL statements." dans le document était erronée. J'ai expliqué l'auteur et lui ai demandé de le changer en " This task is not supported using Transact-SQL statements.". Il y a environ un jour, l'auteur a accepté et le document a été corrigé. Vous pouvez suivre la discussion que nous avons eue sur GitHub .
Ronen Ariely
@RonenAriely bon travail, et merci de me l'avoir fait savoir. J'ai mis à jour ma réponse
robotik
Vous êtes le bienvenu @robotik 😀. J'espère que tous ceux qui viennent ici et voient la réponse avec le plus de votes comprendront que c'est une erreur totale. Malheureusement, les communautés se comportent généralement comme un troupeau (bétail) et une fois qu'un chef et un contributeur principal (qui est considéré comme le meilleur expert) de la communauté ont fait une erreur, d'autres le suivent, comme cela s'est produit dans ce fil. Les gens continuent à voter pour une erreur si elle a déjà obtenu beaucoup de votes (l'approche: "puisque tout le monde le dit, alors c'est vrai"), et d'autres personnes qui viendront sur le forum penseront que c'est la bonne réponse.
Ronen Ariely
1
@RonenAriely, c'est pourquoi je fais toujours défiler vers le bas :)
robotik
13

Ceci est similaire à la question sur l'ordre des enregistrements dans le résultat d'une requête .. et généralement personne n'aime la réponse formellement correcte ;-)

Alors voilà:

  • selon la norme SQL, les colonnes d'une table ne sont pas «ordonnées»
  • par conséquent, a select *ne force pas le renvoi des colonnes dans un ordre particulier
  • typiquement, chaque SGBDR a une sorte d'ordre "par défaut" (généralement l'ordre dans lequel les colonnes ont été ajoutées à la table, soit dans les create table' or in theinstructions alter table add `
  • par conséquent, si vous comptez sur l'ordre des colonnes (parce que vous utilisez les résultats d'une requête pour créer une autre structure de données à partir de la position des colonnes), répertoriez explicitement les colonnes dans l'ordre que vous souhaitez.
Thorsten
la source
11

Vous pouvez bien sûr modifier l'ordre des colonnes dans une instruction SQL. Cependant, si vous souhaitez abstraire l'ordre des colonnes physiques des tables, vous pouvez créer une vue. c'est à dire

CREATE TABLE myTable(
    a int NULL,
    b varchar(50) NULL,
    c datetime NULL
);


CREATE VIEW vw_myTable
AS
SELECT c, a, b
  FROM myTable;

select * from myTable;
a  b  c
-  -  -

select * from vw_myTable
c  a  b
-  -  -
mevdiven
la source
cela change-t-il l'heure de la requête?
blindguy
@blindguy non cela ne change pas l'heure de votre requête
mevdiven
9

Dans SQLServer Management Studio:

Outils -> Options -> Concepteurs -> Concepteurs de tables et de bases de données

  • Désélectionnez «Empêcher l'enregistrement des modifications nécessitant une recréation de table».

Ensuite:

  • cliquez avec le bouton droit sur la table pour laquelle vous souhaitez réorganiser les colonnes.
  • cliquez sur «Conception».
  • Faites glisser les colonnes dans l'ordre souhaité.
  • enfin, cliquez sur Enregistrer.

SQLServer Management Studio supprimera la table et la recréera à l'aide des données.

Tim Connolly
la source
6

Vous pouvez le faire en créant une nouvelle table, en copiant toutes les données, en supprimant l'ancienne table, puis en renommant la nouvelle pour remplacer l'ancienne.

Vous pouvez également ajouter de nouvelles colonnes à la table, copier les données colonne par colonne, supprimer les anciennes colonnes, puis renommer les nouvelles colonnes pour qu'elles correspondent aux anciennes. Un exemple simple ci-dessous: http://sqlfiddle.com/#!3/67af4/1

CREATE TABLE TestTable (
    Column1 INT,
    Column2 VARCHAR(255)
);
GO

insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO

select * from TestTable;
GO

ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO

update TestTable 
set Column1_NEW = Column1, 
    Column2_NEW = Column2;
GO

ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO

sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO

select * from TestTable;
GO
komma8.komma1
la source
1
J'ai écrit une procédure stockée qui fait quelque chose de similaire. Il automatise la reconstruction de la table à l'aide de SQL dynamique. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer
6

Dans SQLServer Management Studio:

Tools-> Options-> Designers->Table and Database Designers

Désélectionner Prevent saving changes that require table re-creation.

Vous pouvez maintenant réorganiser la table.

vikas Chaturvedi
la source
2

Le serveur SQL crée le script en interne. Il crée une table temporaire avec de nouvelles modifications et copie les données et supprime la table actuelle, puis recrée l'insertion de table à partir de la table temporaire. Je le trouve dans l'option "Générer le script de changement" ssms 2014. Script comme celui-ci. À partir de là: Comment modifier l'ordre des colonnes dans une table à l'aide d'une requête SQL

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_emps
    (
    id int NULL,
    ename varchar(20) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.emps)
     EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
        SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.emps
GO
EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT' 
GO
COMMIT
Subhankar
la source
1

Si votre table contient suffisamment de colonnes, vous pouvez essayer ceci. Créez d'abord une nouvelle table avec l'ordre des colonnes préféré.

    create table new as select column1,column2,column3,....columnN from table_name;

Maintenant, supprimez la table à l'aide de la commande drop

    drop table table_name;

renommez maintenant la table nouvellement créée avec votre ancien nom de table.

    rename new to table_name;

maintenant, sélectionnez le tableau, vous avez vos colonnes réorganisées comme vous le souhaitiez auparavant.

    select * from table_name;
Hemanth Nukala
la source
Cela revient à créer une nouvelle table, copier les données de la table existante vers la nouvelle, supprimer l'ancienne et renommer la nouvelle. Donc, à proprement parler, cela ne change pas l'ordre des colonnes du tableau. Comme cela crée / copie à partir de l'ancienne table, cela prend du temps pour les tables énormes. Enfin, la syntaxe proposée ne fonctionne pas dans t-sql.
Jean-François
0

À la fin de la journée, vous ne pouvez tout simplement pas faire cela dans MS SQL. J'ai récemment créé des tables sur le pouce (démarrage de l'application) à l'aide d'une procédure stockée qui lit à partir d'une table de recherche. Lorsque j'ai créé une vue qui les combinait avec une autre table que j'avais créée manuellement plus tôt (même schéma, avec des données), cela a échoué - simplement parce que j'utilisais `` Select * UNION Select * '' pour la vue. En même temps, si j'utilise uniquement ceux créés via la procédure stockée, je réussis.

En conclusion: s'il y a une application qui dépend de l'ordre de la colonne, ce n'est vraiment pas une bonne programmation et cela créera certainement des problèmes à l'avenir. Les colonnes doivent «se sentir» libres d'être n'importe où et être utilisées pour n'importe quel processus de données (INSERT, UPDATE, SELECT).

Chagbert
la source
0

Vous pouvez y parvenir avec ces étapes:

  1. supprimez toutes les clés étrangères et la clé primaire de la table d'origine.

  2. renommer la table d'origine.

  3. à l'aide de CTAS, créez la table d'origine dans l'ordre souhaité.

  4. laissez tomber l'ancienne table.

  5. appliquer toutes les contraintes à la table d'origine

Ravichandra Aj
la source
0

Si les colonnes à réorganiser ont été créées récemment et sont vides, les colonnes peuvent être supprimées et ajoutées de nouveau dans le bon ordre.

Cela m'est arrivé, en étendant manuellement une base de données pour ajouter de nouvelles fonctionnalités, et j'avais manqué une colonne, et quand je l'ai ajoutée, la séquence était incorrecte.

Après n'avoir trouvé aucune solution adéquate ici, j'ai simplement corrigé le tableau en utilisant le type de commandes suivant.

ALTER TABLE  tablename  DROP COLUMN  columnname; 
ALTER TABLE  tablename  ADD columnname columntype;

Remarque: ne faites cela que si vous n'avez pas de données dans les colonnes que vous supprimez.

Les gens ont dit que l'ordre des colonnes n'avait pas d'importance. J'utilise régulièrement SQL Server Management Studio "générer des scripts" pour créer une version texte du schéma d'une base de données. Pour contrôler efficacement la version de ces scripts (git) et les comparer (WinMerge), il est impératif que la sortie des bases de données compatibles soit la même, et les différences mises en évidence sont de véritables différences de base de données.

L'ordre des colonnes est important; mais juste pour certaines personnes, pas pour tout le monde!

Ivan
la source
0

Je suppose que vous souhaitez ajouter une nouvelle colonne dans une position spécifique. Vous pouvez créer une nouvelle colonne en déplaçant les colonnes actuelles vers la droite.

+---+---+---+
| A | B | C |
+---+---+---+

Supprimez tous les index et références de clé étrangère affectés. Ajoutez une nouvelle colonne avec exactement le même type de données que la dernière colonne et copiez-y les données.

+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^

Remplacez le type de données de la troisième colonne par le même type que la colonne précédente et copiez-y les données.

+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^

Renommez les colonnes en conséquence, recréez les index supprimés et les références de clé étrangère.

+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+

Modifiez le type de données de la deuxième colonne.

Gardez à l'esprit que l'ordre des colonnes n'est qu'une chose "cosmétique" comme l' a dit marc_s .

Václav Dajbych
la source
-1

Utilisation

SELECT * FROM TABLE1

qui affiche l'ordre des colonnes par défaut du tableau.

Si vous souhaitez modifier l'ordre des colonnes.

Spécifiez le nom de la colonne à afficher en conséquence

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
solairaja
la source
La question n'est pas une commande temporaire. La question concerne la structure de conception de la table lorsque vous modifiez la table et ajoutez de nouvelles colonnes.
vikas Chaturvedi
-1

vous pouvez utiliser l'indexation. Après l'indexation, si sélectionnez * à partir de XXXX, les résultats doivent être conformes à l'index, mais uniquement l'ensemble de résultats .. pas la structure de la table

Karthik.M
la source
-1

Vous pouvez modifier cela à l'aide d'une requête SQL. Voici une requête SQL pour changer la séquence de la colonne.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
Aashay Shah
la source
Je me demande si cela supprime et recrée la table comme dans SSMS. Quoi qu'il en soit, je ne lancerais pas les dés en faisant cela sur une base de données de production, bien que cette méthode semble intéressante et mérite d'être étudiée.
samis
Cette fonctionnalité ne fonctionne pas dans SQL Server comme cela a été spécifié par l'OP. Je souhaite que ce soit le cas.
Bill
1
Il s'agit de la syntaxe MySQL, pas de SQL Server.
Jon Schneider
-1

Afin d'avoir un ordre de colonne spécifique, vous devez sélectionner colonne par colonne dans l'ordre que vous souhaitez. L'ordre de sélection dicte la façon dont les colonnes seront classées dans la sortie.

Nauris Krūmiņš
la source
-1

Essayez cette commande:

alter table students modify age int(5) first; 

Cela changera la position de l'âge à la première position.

Mwavu Rogers
la source
Ce n'est pas un SQL valide dans MSSQL. Peut-être MySQL ou un autre dialecte, mais pas pour SQL Server 2005
nsimeonov
-2

modifier le nom de la table modifier le nom de la colonne int (5) en premier; amènera la colonne au premier nom de la table modifier le nom de la colonne int (5) après (nomtable);

farhan sait
la source
-3

Exemple: Changez la position de field_priority après field_price dans l'état de la table.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;
lecaoquochung
la source
2
Il s'agit de la syntaxe MySQL, pas de SQL Server.
Jon Schneider