web-dev-qa-db-fra.com

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

Comment changer 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.

78
Himadri

Vous ne pouvez pas. L’ordre des colonnes n’est qu’un aspect «cosmétique» qui nous tient à cœur - pour SQL Server, il n’est presque toujours pas pertinent.

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

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

78
marc_s

Vous devez lister explicitement les champs dans l'ordre dans lequel vous souhaitez les retourner 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
23
lexu

Selon 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 createcopy/drop/rename, comme indiqué par komma8.komma1

Ou vous pouvez utiliser SQL Server Management Studio

  1. Dans _/Object Explorer, cliquez avec le bouton droit sur la table avec les colonnes que vous souhaitez réorganiser, puis cliquez sur Design (Modifier en version 2005 SP1 ou antérieure). 
  2. Sélectionnez la case à gauche du nom de la colonne que vous souhaitez réorganiser. (Vous pouvez sélectionner plusieurs colonnes en maintenant les touches [shift] ou Les touches [ctrl] de votre clavier.)
  3. Faites glisser la ou les colonnes vers un autre emplacement de la table.

Puis cliquez sur Enregistrer. En fait, cette méthode supprime et recrée la table. Certaines erreurs peuvent donc se produire.

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

Si cette option 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> Designers, sinon "L'enregistrement des modifications n'est pas autorisé" une erreur se produit. 

  • Désactiver 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 lors de la recréation de la table. ne désactivez jamais cette option si le suivi des modifications est activé!

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 des colonnes d'origine.

17
robotik

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 renvoi des colonnes dans un ordre particulier.
  • en général, 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 table create table' or in thealter, ajoutez des instructions `
  • par conséquent, si vous vous fiez à l'ordre des colonnes (car vous utilisez les résultats d'une requête pour extraire une autre structure de données à partir de la position des colonnes), répertoriez explicitement les colonnes dans l'ordre souhaité.
11
Thorsten

Vous pouvez bien sûr changer l'ordre des colonnes dans une instruction SQL. Toutefois, 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
-  -  -
9
mevdiven

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 les faire correspondre 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
5
komma8.komma1

Dans SQLServer Management Studio:

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

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

Ensuite:

  • cliquez avec le bouton droit de la souris sur la table pour laquelle vous souhaitez réorganiser les colonnes.
  • cliquez sur 'Design'.
  • Faites glisser les colonnes dans l'ordre de votre choix.
  • enfin, cliquez sur Enregistrer.

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

5
Tim Connolly

Sql Server construit en interne le script. Il crée une table temporaire avec les nouvelles modifications, 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. Un script comme celui-ci. From Here: 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
1
Subhankar

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

    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;

maintenant renommer la table nouvellement créée à votre ancien nom de table.

    rename new to table_name;

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

    select * from table_name;
1
Hemanth Nukala

Vous pouvez y arriver avec ces étapes:

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

  2. renommer la table d'origine.

  3. en utilisant CTAS, créez la table d'origine dans l'ordre de votre choix.

  4. laisse tomber la vieille table.

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

0
Ravichandra Aj

Dans SQLServer Management Studio:

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

Désélectionnez 'Empêcher l'enregistrement des modifications nécessitant la recréation de la table'.

Vous pouvez maintenant réorganiser la table.

0
vikas Chaturvedi

À la fin de la journée, vous ne pouvez tout simplement pas faire cela dans MS SQL. J'ai récemment créé des tables à la volée (démarrage de l'application) à l'aide d'une procédure stockée qui lit une table de recherche. Lorsque j'ai créé une vue combinant celles-ci avec une autre table que j'avais précédemment créée manuellement (même schéma, avec les 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 existe une application qui dépend de l'ordre des colonnes, ce n'est vraiment pas une bonne programmation et créera certainement des problèmes dans le futur. Les colonnes doivent "se sentir" libres d'être n'importe où et être utilisées pour tout traitement de données (INSERT, UPDATE, SELECT).

0
Chagbert

Si les colonnes à réorganiser ont récemment été créées et sont vides, vous pouvez les supprimer et les rajouter dans le bon ordre.

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

N'ayant trouvé aucune solution adéquate ici, j'ai simplement corrigé le tableau à l'aide des commandes suivantes.

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

Remarque: ne le faites que si vous ne disposez 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 le résultat des bases de données compatibles soit identique, et les différences soulignées 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!

0
user3070485

Essayez cette commande:

alter table students modify age int(5) first; 

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

0
Mwavu Rogers

Pour 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 manière dont les colonnes seront triées en sortie.

0
Nauris Krūmiņš

Vous pouvez changer cela en utilisant une requête SQL. Voici 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`;
0
Aashay Shah