Comment changer l'ordre des colonnes dans une table en utilisant la requête sql dans sql server 2005?
Comment changer l'ordre des colonnes dans une table en utilisant la requête SQL dans SQL Server 2005?
Je veux réorganiser l'ordre des colonnes dans une table en utilisant la requête SQL.
18 réponses
Vous ne pouvez pas. L'ordre des colonnes est juste une chose" cosmétique " dont les humains se soucient - pour SQL Server, c'est presque toujours absolument hors de propos.
Ce Que fait SQL Server Management Studio 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
, copiant les données de l'ancienne table, puis la 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 voulez qu'ils soient retournés au lieu d'utiliser * pour l'ordre "par défaut".
Requête originale:
select * from foobar
Renvoie
foo bar
--- ---
1 2
Maintenant écrire
select bar, foo from foobar
bar foo
--- ---
2 1
Par http://msdn.microsoft.com/en-us/library/aa337556.aspx
Cette tâche ne peut pas être effectuée à l'aide des instructions Transact-SQL.
Eh Bien, il peut l'être, à l'aide de create
/ copier / drop
/ renommer, comme répondu par komma8.komma1
Ou vous pouvez utiliser SQL Server Management Studio
- Dans Explorateur d'Objets, cliquez-droit sur la table avec les colonnes que vous souhaitez réorganiser et cliquez sur Conception (Modifier dans ver. 2005 SP1 ou plus tôt)
- Sélectionnez la case à gauche du nom de la colonne que vous souhaitez réorganiser. (Vous pouvez sélectionner plusieurs colonnes en maintenant la touche [Maj] ou la touche [ctrl] de votre clavier.)
- faites glisser la ou les colonnes vers un autre emplacement de la table.
Cliquez ensuite sur Enregistrer. Cette méthode supprime et recrée la table, de sorte que certaines erreurs peuvent 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 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'enregistrement des modifications n'est pas autorisé" l'erreur 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éé, vous devriez donc Ne jamais désactiver 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.
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 la norme SQL, les colonnes d'une table ne sont pas "ordonnées"
- par conséquent, un
select *
ne force pas les colonnes à être retournées 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 le
create table' or in the
modifier la table ajouter ` instructions - par conséquent, si vous comptez sur l'ordre des colonnes (parce que vous utilisez les résultats d'une requête pour poulate une autre structure de données à partir de la position des colonnes), listez explicitement les colonnes dans l'ordre que vous voulez.
Vous pouvez bien sûr changer 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. j'.e
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
- - -
Vous pouvez le faire en créant une nouvelle table, copier toutes les données, supprimer l'ancienne table, puis renommer 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 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
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'.
Puis:
- 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 va supprimer la table et la recréer en utilisant le données.
Si votre table a suffisamment de colonnes, vous pouvez essayer ceci. Créez d'abord 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, renommez 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éarrangées comme vous préférez avant.
select * from table_name;
Sql server construit en interne le script. Il crée une table temporaire avec de nouvelles modifications et copie les données et supprime la table actuelle, puis recréer l'insertion de la table à partir de la table temporaire. Je le trouve à partir de l'option" Générer un script de changement " ssms 2014. Script comme celui-ci. De ici: comment changer l'ordre des colonnes dans une table en utilisant la 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
À la fin de la journée, vous ne pouvez tout simplement pas le faire dans MS SQL. J'ai récemment créé des tables en déplacement (démarrage de l'application) en utilisant une procédure stockée qui lit à partir d'une table de recherche. Lorsque j'ai créé une vue qui les a combinées avec une autre table que j'avais créée manuellement plus tôt (même schéma, avec des 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.
Dans 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 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 (insérer, mettre à jour, Sélectionner).
Vous pouvez changer cela en utilisant la requête SQL. Voici la requête sql pour changer la séquence de colonne.
ALTER TABLE table name
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
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é.
Laisse tomber la vieille table.
-
Appliquer toutes les contraintes à la table d'origine
Si les colonnes à réorganiser ont été créées récemment et sont vides, elles peuvent être supprimées et rajoutées dans le bon ordre.
Cela m'est arrivé, en étendant une base de données manuellement pour ajouter de nouvelles fonctionnalités, et j'avais manqué une colonne, et quand je l'ai ajouté, la séquence était incorrecte.
Après n'avoir trouvé aucune solution adéquate ici, j'ai simplement corrigé la table 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'a 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 A de l'importance; mais juste pour certaines personnes, pas pour tout le monde!
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".
Maintenant, vous pouvez réorganiser la table.
Utiliser
SELECT * FROM TABLE1
Qui affiche l'ordre des colonnes 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 au jeu de résultats.. pas structrue De La Table
Alter table nom de la modifier columnname int(5) de la première; amènera la colonne en premier alter table nom de la modifier columnname int(5) après (nomtable);
Exemple: changer 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`;