it-swarm.com.de

Fügen Sie einer bestimmten Ordinalposition in Microsoft SQL Server eine neue Tabellenspalte hinzu

Ist es möglich, einer Tabelle an einer bestimmten Ordinalposition in Microsoft SQL Server eine Spalte hinzuzufügen?

Zum Beispiel haben unsere Tabellen die Spalten CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy am Ende jeder Tabellendefinition. Ich möchte, dass die neue Spalte in SSMS über diesen Spalten angezeigt wird. 

Gibt es eine Möglichkeit, diese Reihenfolge am Ende der Tabelle beizubehalten, wenn ich alle meine Datenbankänderungen per Skript erstellt? 

Zu Ihrer Information, ich versuche nicht, einen Flammenkrieg auszulösen, falls dies überhaupt geschehen sollte. Wenn Sie etwas über einen Thread lesen möchten, der schnell dazu führt, hier ein guter:

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

33
Even Mien

Sie müssen eine temporäre Tabelle erstellen, die das Schema der ursprünglichen Tabelle widerspiegelt, jedoch in der gewünschten Spaltenreihenfolge, und dann den Inhalt des Originals in temporär kopieren. Löschen Sie das Original und benennen Sie die Temp. Um.

Dies ist, was SQL Management Studio im Hintergrund macht.

Mit einem Schemasynchronisierungstool können Sie diese Skripts automatisch generieren.

26
Jose Basilio

gehen Sie in SQL Server Management Studio und "entwerfen" Sie eine vorhandene Tabelle. Fügen Sie eine Spalte in der Mitte ein, klicken Sie mit der rechten Maustaste in einen leeren Bereich und wählen Sie Generate Change Script ...

Sehen Sie sich nun das erstellte Skript an. Es wird im Grunde eine temporäre Tabelle mit der richtigen Spaltenreihenfolge erstellt, die Daten aus der ursprünglichen Tabelle eingefügt, die ursprüngliche Tabelle gelöscht und die temporäre Tabelle umbenannt. Dies ist wahrscheinlich das, was Sie tun müssen.

 enter image description here

Sie müssen möglicherweise auch diese Option deaktivieren, um die Erstellung von Änderungsskripts zu ermöglichen

 enter image description here

7
KM.

Die Antwort ist ja, es ist technisch möglich, aber Sie haben Kopfschmerzen und es dauert lange, bis sie ausgeführt und eingerichtet werden. 

Eins: Erstellen/Kopieren/Löschen/Umbenennen

Dies ist genau das, was SQL Server in der grafischen Benutzeroberfläche ausführt: Hier ist ein Beispiel für das Skript, das es generiert und ausführt, wenn Sie auf die Schaltfläche "Speichern" klicken, nachdem Sie am Anfang einer Tabelle eine neue Spalte hinzugefügt haben. 

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

Two: ADD COLUMN/UPDATE/DROP COLUMN/RENAME

Diese Methode umfasst im Wesentlichen das Erstellen einer Kopie aller vorhandenen Spalten, die Sie der rechten Spalte Ihrer neuen Spalte hinzufügen möchten. Übertragen Sie die Daten in die neue Spalte, löschen Sie die Originale und benennen Sie die neuen um. Dies führt zu Verwüstungen bei allen Indizes oder Einschränkungen, die Sie haben, da Sie diese neu festlegen müssen. Es ist technisch möglich, jedoch sowohl in Bezug auf die Entwicklung als auch auf die Ausführung zeitraubend. 

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 ihm leben

Das beleidigt stark mein Ordnungsgefühl ... aber manchmal lohnt es sich nicht, es neu zu mischen. 

6
AHiggins

Meines Wissens gibt es keine bekannte Methode, um die Reihenfolge der Spalte zu ändern. Hinter den Kulissen macht SQL Management Studio das, was Jose Basilio gesagt hat. Und wenn Sie eine große Tabelle haben, ist es unpraktisch, die Spaltenreihenfolge auf diese Weise zu ändern.

Sie können eine "Ansicht" verwenden. Mit SQL-Ansichten können Sie eine beliebige Reihenfolge verwenden, ohne von den Änderungen der Tabellenspalten beeinflusst zu werden.

3
tbaskan

Schmutzig und einfach.
Tabelle in csv exportieren.
Neue Daten an gewünschter Stelle einfügen.
Tabelle ablegen.
Erstellen Sie eine neue Tabelle mit den gewünschten Spaltenangaben.
Laden Sie Spalten aus csv in eine neue Tabelle. 

0
BioDeveloper

Ich bin nicht sicher, ob der Thread noch aktiv ist. Ich hatte dieselbe Abfrage mit der MySQL-Datenbank. Wenn Sie mit der rechten Maustaste auf die Tabelle klicken und "ALTER" auswählen, wird der folgende Code automatisch generiert. Probe von sakila db zur Verfügung gestellt und es hat funktioniert. Finden Sie einfach die Spalte heraus, hinter der Sie Ihre neue Spalte einfügen möchten, und verwenden Sie das Schlüsselwort 'AFTER'

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

TFS 2013 erledigt dies automatisch für Sie .

Fügen Sie die neuen Spalten Ihrer Tabelle hinzu, und bestätigen Sie Ihre Änderungen in TFS. Von dort aus können Sie die SQL-Datei der Tabelle in Visual Studio öffnen und die Reihenfolge der Spalten im T-SQL-CREATE-Skript manuell verschieben. Anschließend können Sie die Zieldatenbank mithilfe des VS-Schemavergleichungs-Tools unter Tools> SQL Server> Neuer Schemavergleich aktualisieren. Wählen Sie Ihr Datenbankprojekt mit Ihrer Änderung als Quelle und der Datenbank, die Sie als Ziel aktualisieren möchten. Vergleichen Sie, wählen Sie das Skript der Tabelle aus und aktualisieren Sie. VS wird automatisch gelöscht und hinzugefügt. Alle Ihre Daten sind sicher und auch Indizes.

0
Rickest Rick

wählen Sie alle Spalten in der temporären Tabelle aus und erstellen Sie eine neue Tabelle mit der gewünschten neuen Spalte Die alte Tabelle löschen, alle Spalten aus der temporären Tabelle auswählen und mit reorder nach neuer Spalte einfügen. 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 '[email protected]+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
0
suraj sharma

Ich denke, dass es einfach ist, die Spalte ALTER TABLE table1 ADD .. hinzuzufügen und dann eine tmp-Tabelle wie tmp_table1 aus dem select like SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; das ist es. Ich hoffe es hilft jemandem

0