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

StackOverflow https://stackoverflow.com/questions/769828

Question

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

Par exemple, nos tables ont toujours CreatedOn, CreatedBy, LastModifiedOn, colonnes lastModifiedBy à la "fin" de chaque définition de la table? Je voudrais la nouvelle colonne pour apparaître dans SSMS au-dessus de ces colonnes.

Si je Scripting tous mes changements de base de données, est-il un moyen de préserver cet ordre à la fin de la table?

Pour votre information, je ne suis pas d'essayer de mettre en place une guerre de flamme si cela devrait même être fait. Si vous voulez lire sur un fil qui dégénère rapidement en cela, voici une bonne:

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

Était-ce utile?

La solution

Vous devez créer une table temporaire qui reflète le schéma de la table d'origine, mais avec l'ordre des colonnes que vous voulez, puis copier le contenu de l'original à température. Supprimer l'original et renommer la température.

est ce que SQL Management Studio fait dans les coulisses.

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

Autres conseils

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

Maintenant, regardez le script crée. il sera essentiellement créer une table temporaire avec l'ordre de la colonne appropriée, insérer les données de la table d'origine, laissez tomber la table d'origine, et renommer la table temporaire. Ceci est probablement ce que vous devez faire.

 ici

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

 ici

La réponse est oui, il est techniquement possible, mais vous aurez un mal de tête faire et il faudra beaucoup de temps pour exécuter et mettre en place.

One: Créer / Copier / déplacer / renommer

est en fait ce que SQL Server fait dans l'interface graphique: voici un exemple du script qu'il génère et exécuter 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: ADD COLUMN / UPDATE / colonne DROP / RENAME

Cette méthode consiste essentiellement à créer une copie de toutes les colonnes existantes que vous souhaitez ajouter à la « droite » de votre nouvelle colonne, le transfert des données vers la nouvelle colonne, puis déposer les originaux et renommer les nouveaux. Cela faire des ravages avec des index ou des contraintes que vous avez, puisque vous devez les rejointoiement. Il est techniquement possible, mais encore une fois de temps en termes de développement et de l'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

Cette offense mon sens avec force l'ordre ... mais parfois, ça ne vaut pas remaniements.

A ma connaissance, il n'y a pas de méthode connue pour modifier l'ordre de la colonne. Dans les coulisses SQL Management Studio fait ce que dit Jose Basilio. Et si vous avez une grande table, alors il est impossible de changer l'ordre des colonnes comme cette façon.

Vous pouvez utiliser une « vue ». Avec des vues SQL vous pouvez utiliser l'ordre que vous voulez sans vous touché par les changements de colonne de table.

TFS 2013 fera automatiquement pour vous .

Ajoutez la nouvelle colonne (s) à votre table de toute façon vous le souhaitez, puis vos changements à TFS. De là, vous pouvez ouvrir dans Visual Studio et déplacer manuellement le fichier sql de la table l'ordre des colonnes dans le script T-SQL CREATE. Ensuite, vous pouvez mettre à jour votre base de données cible en utilisant le schéma de VS COMPARATEUR trouvé sous Outils> SQL Server> Nouveau schéma de comparaison. Choisissez votre projet de base de données avec votre changement comme la source et la base de données que vous souhaitez mettre à jour comme cible. Comparer, sélectionnez le script de la table, et mise à jour. VS baissera et ajouter automatiquement. Toutes vos données seront en sécurité et les index aussi.

sale et simple.
Exporter la table à csv.
Insérez de nouvelles données à la position désirée.
table de baisse.
Créer un nouveau tableau avec les spécifications de la colonne désirée.
colonnes de charge de csv nouvelle table.

Ce que je pense est simple est d'ajouter la colonne ALTER TABLE table1 ADD .. puis créer un à partir de la sélection comme la table tmp comme tmp_table1 SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; puis déposez-table1 et renommer le tmp_table1 à table1, c'est-il. J'espère que cela va aider quelqu'un

Je ne sais pas si le fil est toujours actif. Je faisais la même requête avec base de données MySQL. Un clic droit de la table et la sélection automatique « ALTER » a généré le code ci-dessous. Échantillon fourni de sakila db et cela a fonctionné. Il suffit de trouver la colonne après laquelle vous souhaitez placer votre nouvelle colonne et utilisation « après » mot-clé

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

sélectionner toute la colonne dans la table temporaire, et créer un nouveau tableau avec une nouvelle colonne que vous voulez  déposer l'ancienne table, sélectionnez toute la colonne de la table temporaire et l'insérer dans une nouvelle colonne avec de réordonnancement. 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top