Comment changer l’ordre des colonnes dans une table en utilisant la requête SQL dans SQL Server 2005?

Comment modifier l’ordre des colonnes dans une table à l’aide de la requête SQL dans SQL Server 2005?

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

Vous ne pouvez pas. L’ordre des colonnes est simplement une chose “cosmétique” dont nous, les humains, sums soucieux – pour SQL Server, il est presque toujours absolument inutile.

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 commande CREATE TABLE , en copiant les données de l’ancienne table et en les supprimant.

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

Vous devez lister explicitement les champs dans l’ordre dans lequel vous souhaitez qu’ils soient retournés au lieu d’utiliser * pour l’ordre «par défaut».

requête originale:

 select * from foobar 

résultats

 foo bar --- --- 1 2 

maintenant écris

 select bar, foo from foobar bar foo --- --- 2 1 

Conformément à http://msdn.microsoft.com/en-us/library/aa337556.aspx

Cette tâche ne peut pas être effectuée à l’aide d’instructions Transact-SQL.

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

Ou vous pouvez utiliser SQL Server Management Studio

  1. Dans l’ Explorateur d’objects , cliquez avec le bouton droit de la souris sur la table contenant les colonnes à réorganiser, puis cliquez sur Conception (Modifier dans version 2005 SP1 ou version antérieure).
  2. Cochez la case située à gauche du nom de la colonne à réorganiser. (Vous pouvez sélectionner plusieurs colonnes en maintenant les touches [shift] ou [ctrl] de votre clavier.)
  3. Faites glisser la ou les colonnes vers un autre emplacement dans la table.

Cliquez ensuite sur Enregistrer. Cette méthode supprime et recrée la table, ce qui peut entraîner des erreurs.

Si l’option de suivi des modifications est activée pour la firebase database et la table, vous ne devez pas utiliser cette méthode.

S’il est désactivé, 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> Designers, sinon l’erreur “Enregistrement des modifications est interdite” se produit.

  • Il est fortement déconseillé de désactiver l’option Empêcher l’enregistrement des modifications nécessitant la recréation de table , car cela entraîne la suppression des informations de suivi des modifications existantes lors de la recréation de la table. Vous ne devez donc jamais désactiver cette option si 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 l’ordre de la colonne d’origine.

Ceci est similaire à la question sur la commande 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 le standard SQL, les colonnes d’une table ne sont pas “ordonnées”
  • par conséquent, un select * ne force pas le retour des colonnes dans un ordre particulier
  • En règle générale, 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 la create table' or in the , soit dans les instructions add table).
  • Par conséquent, si vous utilisez l’ordre des colonnes (car vous utilisez les résultats d’une requête pour générer d’autres structures de données à partir de la position des colonnes), répertoriez explicitement les colonnes dans l’ordre souhaité.

Vous pouvez bien sûr modifier l’ordre des colonnes dans une instruction SQL. Toutefois, si vous souhaitez extraire l’ordre des colonnes physiques des tableaux, 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; abc - - - select * from vw_myTable cab - - - 

Vous pouvez le faire en créant une nouvelle table, copier toutes les données, déposer l’ancienne table, puis renommer la nouvelle pour remplacer l’ancienne.

Vous pouvez également append 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 

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».

Alors:

  • Cliquez avec le bouton droit sur la table pour laquelle vous souhaitez réorganiser les colonnes.
  • cliquez sur ‘Design’.
  • Faites glisser les colonnes dans l’ordre souhaité.
  • Enfin, cliquez sur Enregistrer.

SQLServer Management Studio supprimera la table et la recréera en utilisant les données.

Si votre table a suffisamment de colonnes, vous pouvez essayer ceci. Commencez par créer une nouvelle table avec un ordre de colonnes préféré.

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

Maintenant, déposez la table en utilisant la commande drop

  drop table table_name; 

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

  rename new to table_name; 

Maintenant, sélectionnez la table, vous avez vos colonnes réorganisées comme vous avez préféré avant.

  select * from table_name; 

Le serveur SQL construit en interne le script. Il crée une table temporaire avec de nouvelles modifications et copie les données et supprime la table courante, puis recrée la table d’insertion à partir de la table temporaire. Je le trouve à partir de l’option “Generate Change script” ssms 2014. Script comme celui-ci. À partir d’ ici: 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 

En fin de compte, vous ne pouvez tout simplement pas le faire dans MS SQL. J’ai récemment créé des tables en déplacement (démarrage d’application) en utilisant une procédure stockée qui lit dans une table de consultation. Lorsque j’ai créé une vue qui les combinait avec une autre table, j’en avais créé une autre manuellement (même schéma, avec données). Elle a échoué, simplement parce que j’utilisais ” Select * UNION Select * ‘pour la vue. En même temps, si je n’utilise que ceux créés par 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 des problèmes à l’avenir. Les colonnes doivent être «libres» d’être n’importe où et être utilisées pour tout processus de données (INSERT, UPDATE, SELECT).

Vous pouvez changer cela en utilisant la 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`; 

Vous pouvez y parvenir avec ces étapes:

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

  2. renommez la table d’origine.

  3. L’utilisation de CTAS crée la table d’origine dans l’ordre souhaité.

  4. déposez l’ancienne table.

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

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

Cela m’est arrivé, en étendant une firebase database manuellement pour append de nouvelles fonctionnalités, et j’avais omis une colonne, et quand je l’ai ajoutée, la séquence était incorrecte.

Après 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 le faites que si vous n’avez pas de données dans les colonnes que vous déposez.

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 firebase database. 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 identique, et les différences mises en évidence sont de véritables différences entre les bases de données.

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

Dans SQLServer Management Studio:

Outils -> Options -> Designers -> 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».

Vous pouvez maintenant réorganiser la table.

Utilisation

 SELECT * FROM TABLE1 

qui affiche l’ordre de colonne par défaut de la table.

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 

vous pouvez utiliser l’indexation .. Après l’indexation, si select * from XXXX, les résultats doivent être conformes à l’index, mais uniquement les résultats .. pas structrue de la table

modifier le nom de la table modifier nomcolonne int (5) en premier; amènera la colonne à modifier d’abord le nom de la table, modifier nomcolonne int (5) après (nomtable);

Exemple: Modifier la position de field_priority après field_price dans le statut de la table.

 ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;