web-dev-qa-db-fra.com

Ajouter une nouvelle colonne de table à une position 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 des colonnes CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy à la "fin" de chaque définition de table? J'aimerais que la nouvelle colonne apparaisse dans SSMS au-dessus de ces colonnes. 

Si je suis en train d'écrire toutes mes modifications de base de données, y a-t-il un moyen de conserver cet ordre à la fin de la table? 

Pour votre information, je ne cherche pas à instituer une guerre de flammes si cela devait être fait. Si vous voulez en savoir plus sur un thread qui dégénère rapidement en celui-ci, en voici un bon:

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

33
Even Mien

Vous devez créer une table temporaire qui reflète le schéma de la table d'origine mais avec l'ordre des colonnes souhaité, puis copiez le contenu de l'original dans temp. Supprimer l'original et renommer le temp.

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

Avec un outil de synchronisation de schéma, vous pouvez générer ces scripts automatiquement.

26
Jose Basilio

allez dans SQL Server Management Studio et "concevez" une table existante. Insérez une colonne au milieu, faites un clic droit dans une zone vide et sélectionnez Générer un script de changement ... 

Maintenant, regardez le script qu'il crée. il va en principe créer une table temporaire avec le bon ordre de colonne, insérer les données de la table d'origine, supprimer la table d'origine et renommer la table temporaire. C'est probablement ce que vous devrez faire.

 enter image description here

Vous devrez peut-être également décocher cette option pour autoriser la création de scripts de modification.

 enter image description here

7
KM.

La réponse est oui, c'est techniquement possible, mais vous aurez mal à la tête et cela prendra beaucoup de temps à exécuter et à mettre en place. 

One: Créer/Copier/Supprimer/Renommer

C’est 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 du tableau. 

/* 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: ADD COLUMN/UPDATE/DROP COLUMN/RENAME

Cette méthode consiste essentiellement à créer une copie des colonnes existantes que vous souhaitez ajouter à la droite de votre nouvelle colonne, à transférer les données dans la nouvelle colonne, à supprimer les originaux et à renommer les nouveaux. Cela va faire des ravages avec tous les index ou contraintes que vous avez, car vous devez les recoiffer. C'est techniquement possible, mais encore une fois, cela prend du temps en développement et en 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 heurte énormément mon sens de l'ordre ... mais parfois, cela ne vaut pas la peine de remanier. 

6
AHiggins

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

Vous pouvez utiliser une "vue". Avec les vues SQL, vous pouvez utiliser l'ordre de votre choix sans être affecté par les modifications apportées aux colonnes de la table.

3
tbaskan

Sale et simple.
Exporter la table au format csv.
Insérez les nouvelles données à la position souhaitée.
Table de dépôt.
Créer une nouvelle table avec les spécifications de colonne souhaitées.
Charge les colonnes de CSV à la nouvelle table. 

0
BioDeveloper

Je ne suis pas sûr si le fil est toujours actif. J'avais la même requête avec la base de données MySQL. Faites un clic droit sur la table et sélectionnez "ALTER" pour générer automatiquement le code ci-dessous. Échantillon fourni par sakila db et cela a fonctionné. Trouvez juste la colonne après laquelle vous voulez placer votre nouvelle colonne et utilisez le mot clé 'AFTER'

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 
0

TFS 2013 le fera automatiquement pour vous .

Ajoutez la ou les nouvelles colonnes à votre table comme vous le souhaitez, puis validez vos modifications dans TFS. À partir de là, vous pouvez ouvrir le fichier SQL de la table dans Visual Studio et déplacer manuellement l'ordre des colonnes dans le script CREATE T-SQL. Vous pouvez ensuite mettre à jour votre base de données cible à l'aide de l'outil de comparaison de schéma de VS disponible dans Outils> SQL Server> Nouvelle comparaison de schéma. Choisissez votre projet de base de données avec votre modification en tant que source et la base de données que vous souhaitez mettre à jour en tant que cible. Comparez, sélectionnez le script de la table et mettez à jour. VS va déposer et ajouter automatiquement. Toutes vos données seront en sécurité, ainsi que les index.

0
Rickest Rick

sélectionnez toutes les colonnes de la table temporaire et créez une nouvelle table avec la nouvelle colonne souhaitée déposez l'ancienne table, sélectionnez toute la colonne de la table temporaire et insérez-la dans la nouvelle colonne avec réorganisation. et sans perte de données

select * FROM TEMP
select * from originaltbl
select * from #Stagintbl 



declare @ColumnName nvarchar(max);
set @ColumnName=(select
   distinct  
    stuff((
        select ',' + a.COLUMN_NAME
        from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a

        for xml path('')
    ),1,1,'') as ColumnName)

declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
0
suraj sharma

Ce que je pense être simple, c’est d’ajouter la colonne ALTER TABLE table1 ADD .. puis de créer une table tmp comme tmp_table1 à partir de la sélection SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; c'est ça. J'espère que ça va aider quelqu'un

0
Maurice Rwabuhungu