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.
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.
Réponses:
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 TABLE
commande, 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.
INSERT
sans spécifier explicitement vos colonnes de toute façon!
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
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
- 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)
- 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.)
- 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.
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.
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 .
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à:
select *
ne force pas le renvoi des colonnes dans un ordre particuliercreate table' or in the
instructions alter table add `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
- - -
Dans SQLServer Management Studio:
Outils -> Options -> Concepteurs -> Concepteurs de tables et de bases de données
Ensuite:
SQLServer Management Studio supprimera la table et la recréera à l'aide des données.
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
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.
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
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;
À 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).
Vous pouvez y parvenir avec ces étapes:
supprimez toutes les clés étrangères et la clé primaire de la table d'origine.
renommer la table d'origine.
à l'aide de CTAS, créez la table d'origine dans l'ordre souhaité.
laissez tomber l'ancienne table.
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 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!
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 .
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
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`;
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.
Essayez cette commande:
alter table students modify age int(5) first;
Cela changera la position de l'âge à la première position.
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);
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`;