Frage

Ist es möglich, eine Spalte eine Tabelle zu einer bestimmten Ordnungsposition in Microsoft SQL Server hinzufügen?

Zum Beispiel unsere Tabellen immer CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy Spalten am „Ende“ jeder Tabellendefinition? Ich würde die neue Spalte wie oben diesen Spalten in SSMS zu zeigen.

Wenn ich scripting all meine Datenbankänderungen, ist es eine Möglichkeit, diese Ordnung am Ende der Tabelle zu erhalten?

FYI, ich versuche nicht, eine Flamme Krieg auf einzuleiten, wenn dies auch getan werden soll. Wenn Sie einen Thread lesen über wollen, das schnell in die degeneriert, hier ist ein guter:

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

War es hilfreich?

Lösung

Sie haben eine temporäre Tabelle erstellen, die die ursprüngliche Tabelle Schema spiegelt aber mit der Spaltenreihenfolge, dass Sie möchten, kopieren Sie den Inhalt des Originals Temp. Löschen Sie das Original und benennen Sie die Temp.

Dies ist, was SQL Management Studio hat hinter den Kulissen.

Mit einem Schema Sync-Tool können Sie diese Skripte automatisch generieren.

Andere Tipps

geht in SQL Server Management Studio, und "Design" eine vorhandene Tabelle. Legen Sie eine Spalte in der Mitte der rechten Maustaste in einen leeren Bereich und wählen Sie generieren Change Script ...

Nun ein Blick auf das Skript es schafft. es wird im Grunde eine temporäre Tabelle mit der richtigen Spalte um, legen Sie die Daten aus der ursprünglichen Tabelle, fällt die Original-Tabelle erstellen und die temporäre Tabelle umbenennen. Dies ist wahrscheinlich das, was Sie tun müssen.

 image description hier

Sie können auch diese Option müssen deaktivieren um die Erstellung von Änderungsskripts zu erlauben

 image description hier

Die Antwort ist ja, es technisch möglich ist, aber Sie werden Kopfschmerzen haben, so zu tun, und es wird eine lange Zeit bis zur Ausführung und setzen zu nehmen.

One: Erstellen / Kopieren / Tropfen / Umbenennen

Das ist eigentlich das, was SQL Server ist in der grafischen Oberfläche zu tun: Hier ist ein Beispiel für das Skript wird Erstellen und Ausführen, wenn Sie auf die Schaltfläche ‚Speichern‘, nachdem Sie eine neue Spalte zu Beginn einer Tabelle hinzugefügt wird.

/* 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

Zwei: ADD COLUMN / UPDATE / DROP COLUMN / RENAME

Dieses Verfahren beinhaltet im Grunde eine Kopie der vorhandenen Spalten erstellen, die Sie wollen die ‚richtige‘ Ihrer neuen Spalte, die Übertragung der Daten in die neue Spalte hinzuzufügen, dann die Originale löschen und die neuen umbenennen. Dies wird spielen Chaos mit irgendwelchen Indizes oder Einschränkungen, die Sie haben, da Sie sie repoint müssen. Es ist technisch möglich, aber auch hier zeitraubend sowohl in Bezug auf die Entwicklung und Ausführung.

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

Drei: Mit it

Das ärgert mächtig meinen Sinn für Ordnung ... aber manchmal ist es einfach nicht wert Umbildung.

Mein Wissen gibt es keine bekannte Methode, um die Reihenfolge der Spalte zu ändern. Hinter den Kulissen SQL Management Studio tut, was, sagte Jose Basilio. Und wenn Sie einen großen Tisch haben, dann ist es nicht praktikabel, die Spalten Aufträge wie diese Art und Weise zu ändern.

Sie können eine „Ansicht“ verwenden. Mit SQL-Ansichten können Sie einen beliebigen Reihenfolge Sie verwenden, ohne durch die Tabellenspalte Änderungen betroffen zu werden.

TFS 2013 wird dies für Sie tun automatisch .

Fügen Sie die neue Spalte (n) auf den Tisch irgendwie, das Sie mögen, und dann Änderungen an TFS begehen. Von dort können Sie die SQL-Datei in Visual Studio Tabelle öffnen und manuell die Reihenfolge der Spalten in der T-SQL CREATE-Skript bewegen. Dann können Sie Ihre Zieldatenbank aktualisieren, indem VS Schema vergleichen Werkzeug gefunden unter Tools> SQL Server> Neue Schemavergleich verwendet wird. Wählen Sie Ihre Datenbank-Projekt mit der Änderung als Quelle und die Datenbank, die Sie als Ziel aktualisieren möchten. Vergleichen Wählen Sie das Skript der Tabelle und aktualisieren. VS wird automatisch löschen und hinzufügen. Alle Ihre Daten werden sicher und Indizes zu.

Schmutzige und einfach.
Export-Tabelle csv.
Setzen Sie neue Daten in der gewünschten Position.
Drop-Tabelle.
Erstellen Sie neue Tabelle mit den gewünschten Spaltenangaben.
Last Spalten von csv zu neuer Tabelle.

Was ich denke einfach ist die Spalte ALTER TABLE table1 ADD .. hinzufügen und dann eine tmp Tabelle wie tmp_table1 aus der Auswahl erstellen wie SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; und dann fallen tabelle1 und benennen Sie die tmp_table1 zu Tabelle 1, das ist es. Ich hoffe, es wird jemand helfen

Ich bin nicht sicher, ob der Thread noch aktiv ist. Ich hatte die gleiche Abfrage mit MySQL-Datenbank. Rechtsklick auf den Tisch und Auswählen ‚ALTER‘ auto den Code unten erzeugt. Probe von Sakila db zur Verfügung gestellt und es funktionierte. finden Sie einfach die Spalte, nach der Sie Ihre neue Spalte und Verwendung ‚nach‘ Stichwort setzen

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

Wählen Sie alle Spalte in temporäre Tabelle, und neue Tabelle erstellen mit neuen Spalte, die Sie wollen  fallen die alte Tabelle, wählen Sie alle die Spalte aus temporären Tabelle und legen Sie in neue mit Neuordnungs Spalte. und ohne Datenverlust

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top