Ajouter une nouvelle colonne de table à la position ordinale spécifique dans Microsoft SQL Server

est-il possible d'ajouter une colonne à une table à une position ordinale spécifique dans Microsoft SQL Server?

par exemple, nos tables ont toujours été créées par, créées par, modifiées par, modifiées par des colonnes à la "fin" de chaque définition de table? J'aimerais que la nouvelle colonne apparaisse en SSMS au-dessus de ces colonnes.

si je scripte toutes les modifications de ma base de données, y a-t-il un moyen de préserver cet ordre à la fin de la table?

pour info, je ne suis pas en train de lancez une guerre de mots si cela devait être fait. Si vous voulez lire sur un thread qui dégénère rapidement, voici une bonne:

http://www.developersdex.com/sql/message.asp?p=581&r=5014513

30
demandé sur Murilo Garcia 2009-04-20 23:48:58

9 réponses

vous devez créer une table temp qui reflète le schéma de la table originale mais avec l'ordre de la colonne que vous voulez, puis copier le contenu de l'original à temp. Supprimer l'original et renommer le temp.

C'est ce que fait SQL Management Studio en coulisse.

avec un outil de synchronisation schema, vous pouvez générer ces scripts automatiquement.

23
répondu Jose Basilio 2009-04-20 19:54:34

La réponse est oui, c'est techniquement possible, mais vous aurez un mal de tête le faire et qu'il faudra du temps pour s'exécuter et configurer.

: Créer/Copier/Supprimer/Renommer

C'est en fait ce que fait SQL Server dans l'interface graphique: voici un exemple du script qu'il génère et exécute lorsque vous cliquez sur le bouton "Enregistrer" après avoir ajouté une nouvelle colonne au début d'une table.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
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_SomeTable
    (
    MyNewColumn int NOT NULL,
    OriginalIntColumn int NULL,
    OriginalVarcharColumn varchar(100) NULL
    )  ON [PRIMARY]
     TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON
GO
IF EXISTS(SELECT * FROM dbo.SomeTable)
     EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF
GO
DROP TABLE dbo.SomeTable
GO
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO

GO
COMMIT

deux: Ajouter COLONNE / UPDATE / DROP COLONNE / RENAME

cette méthode consiste essentiellement à créer une copie de n'importe quelles colonnes existantes que vous voulez ajouter à la 'droite' de votre nouvelle colonne, en transférant les données à la nouvelle colonne, puis en laissant tomber les originaux et en renommant les nouvelles. Cela va faire des ravages avec les index ou les contraintes que vous avez, puisque vous devez les repoindre. C'est techniquement possible, mais encore une fois cela prend du temps en termes de développement et d'exécution.

CREATE TABLE MyTest (a int, b int, d int, e int)

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5)

SELECT * FROM MyTest -- your current table

ALTER TABLE MyTest ADD c int -- add a new column
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move
ALTER TABLE MyTest ADD e_new int

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns

ALTER TABLE MyTest DROP COLUMN d -- remove the originals
ALTER TABLE MyTest DROP COLUMN e

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns
EXEC SP_RENAME 'MyTest.e_new', 'e';

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample

Trois: Vivre avec elle

cela offense fortement mon sens de l'ordre ... mais parfois, il n'est tout simplement pas la peine de remaniement.

6
répondu AHiggins 2014-10-16 18:59:06

aller dans SQL Server management Studio, et" concevoir " une table existante. Insérez une colonne au milieu, faites un clic droit dans une zone vide et sélectionnez Générer Le Script De Changement...

Maintenant, regardez le script qu'il crée. il créera essentiellement une table temp avec l'ordre de colonne approprié, insérera les données de la table originale, laissera tomber la table originale, et renommera la table temp. C'est probablement ce dont vous aurez besoin faire.

enter image description here

vous pouvez aussi avoir besoin de décocher cette option pour permettre la création de scripts de modification

enter image description here

4
répondu KM. 2018-09-04 05:57:58

À ma connaissance, il n'existe pas de méthode connue pour modifier l'ordre de la colonne. Dans les coulisses SQL Management Studio fait ce que José Basilio a dit. Et si vous avez une grande table alors il n'est pas pratique de changer les ordres de colonne de cette façon.

Vous pouvez utiliser une "vue". Avec les vues SQL vous pouvez utiliser n'importe quel ordre que vous voulez sans être affecté par les changements de colonne de table.

3
répondu tbaskan 2009-04-20 20:01:31

TFS 2013 le fera pour vous automatiquement.

ajoutez la ou les nouvelles colonnes à votre table de toute façon que vous voulez, puis propagez vos modifications à TFS. De là, vous pouvez ouvrir le fichier sql de la table dans Visual Studio et déplacer manuellement l'ordre des colonnes dans le T-SQL créer le script. Ensuite, vous pouvez mettre à jour votre base de données cible en utilisant l'outil de comparaison de schéma de VS trouvé sous Outils > SQL Server > Nouvelle comparaison de schéma. Choisissez votre projet de base de données avec votre changement source, et la base de données que vous voulez mettre à jour comme la cible. Comparez, sélectionnez le script de la table et mettez à jour. VS va tomber et s'ajouter automatiquement. Toutes vos données seront en sécurité, et les index aussi.

0
répondu Rickest Rick 2016-07-14 19:18:39

sale et simple.

Exporter une table vers un fichier csv.

Insérer de nouvelles données à la position désirée.

Drop table.

Créer une nouvelle table avec les spécifications de colonne désirées.

Chargez les colonnes de csv à la nouvelle table.

0
répondu BioDeveloper 2017-08-18 09:26:40

ce que je pense est simple est d'ajouter la colonne Modifier le tableau 1 Ajouter .. et ensuite créer une table tmp comme tmp_table1 à partir du select comme SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; ensuite, supprimez table1 et renommez tmp_table1 en table1, c'est tout. J'espère que ça aidera quelqu'un

0
répondu Maurice Rwabuhungu 2018-03-13 20:14:30

Je ne suis pas sûr que le fil soit encore actif. J'avais la même requête avec la base de données MySQL. En cliquant droit sur la table et en sélectionnant "ALTER" auto généré le code ci-dessous. Échantillon fourni par sakila db et ça a marché. Il suffit de trouver la colonne après laquelle vous voulez placer votre nouvelle colonne et d'utiliser "après" mot-clé

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 
0
répondu Kishore Ramakrishnan 2018-08-26 19:29:51

Vous ne pouvez pas créer une colonne à un ordinal emplacement dans la structure de la table - plus, pourquoi voudriez-vous?? L'ordre des colonnes dans SQL Server est totalement hors de propos.

SQL Server Management Studio a une vue de conception qui vous permet apparemment de créer une colonne à n'importe quel endroit dans la liste des colonnes - mais ce qui se passe vraiment ici en arrière-plan est que la nouvelle table avec les nouvelles colonnes est créée et l'ancienne est abandonnée.

Il n'y a pas Commandes DDL SQL pour créer une colonne à un endroit spécifique ou pour "réordonner" les colonnes. C'est pas vraiment nécessaire.

Marc

-1
répondu marc_s 2009-04-20 20:23:12