it-swarm.com.de

Wie ändere ich die Spaltenreihenfolge?

Wie ändere ich die Spaltenreihenfolge in SQL Server 2008 R2?

ZB: Meine Tischreihenfolge ist Eid ------ Ename ----- Esalary

Ich weiß, ich möchte dieses Format wie Eid --- Gehalt ---- Ename

Vielen Dank.

5
user36326

Sie sollten sich nicht um die physische Spaltenreihenfolge in der Tabelle kümmern. Der einzige Fall, in dem dies Anlass zur Sorge geben sollte, ist die Verwendung von SELECT * - und das sollten Sie nicht tun , Sie sollten die Spaltennamen explizit auflisten (und Sie können die Spalten dann in einer beliebigen Reihenfolge einfügen).

Sie können die Tabelle löschen und neu erstellen, wie andere gesagt haben, mit den Spalten in Ihrer bevorzugten Reihenfolge. Dies wird jedoch sehr störend sein (Blockieren, E/A), wenn Ihre Tabelle groß ist, da alle anderen Benutzer im System warten müssen, bis dies abgeschlossen ist. Wenn Sie genau sehen möchten, was Management Studio tut, erstellen Sie diese Tabelle:

CREATE TABLE dbo.foo(b INT, a INT, r INT);

INSERT dbo.foo(b,a,r) VALUES(1,2,3),(4,5,6);

Klicken Sie nun im Objekt-Explorer mit der rechten Maustaste auf die Tabelle und wählen Sie Design. Aktivieren Sie das Feld links neben dem Spaltennamen, den Sie neu anordnen möchten. Ziehen Sie die Spalte an eine andere Stelle in der Tabelle. Ich habe a über b verschoben, weil ich OCD bin und die Spalten in alphabetischer Reihenfolge haben wollte:

enter image description here

Dann habe ich auf die Schaltfläche "Änderungsskript generieren" geklickt, und hier ist die Monstrosität, die sie erstellt hat (und beachten Sie, dass dies ein Haufen ohne Schlüssel, Einschränkungen, Auslöser usw. ist - diese Neuerstellung kann ziemlich komplex werden).

/*
   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_foo
    (
    a int NULL,
    b int NULL,
    r int NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_foo SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.foo)
     EXEC('INSERT INTO dbo.Tmp_foo (a, b, r)
        SELECT a, b, r FROM dbo.foo WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.foo
GO
EXECUTE sp_rename N'dbo.Tmp_foo', N'foo', 'OBJECT' 
GO
COMMIT

Lassen Sie uns zum Spaß etwas Komplexeres erstellen:

CREATE TABLE dbo.flarb
(
  a INT PRIMARY KEY, 
  b INT NOT NULL CHECK (b>1), 
  c ROWVERSION, 
  d DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  e UNIQUEIDENTIFIER NOT NULL DEFAULT NEWSEQUENTIALID()
);

CREATE TABLE dbo.blarf
(
  a INT NOT NULL FOREIGN KEY REFERENCES dbo.flarb(a)
);
GO

CREATE TRIGGER dbo.flarb_tr
ON dbo.flarb
FOR UPDATE
AS
  SELECT 1;
GO

CREATE VIEW dbo.flarb_v
WITH SCHEMABINDING
AS
  SELECT a FROM dbo.flarb;

Jetzt versuchen wir das Gleiche:

'Flarb'-Tisch
- Fehler beim Überprüfen der Standardeinstellung für Spalte 'e'.
- Warnung: Die folgenden schemagebundenen Objekte werden geändert:
- Ansicht 'dbo.flarb_v': Die Schemabindung wird entfernt.

Hoppla. Zum Glück können wir immer noch sehen, wie das Skript aussehen 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
ALTER VIEW dbo.flarb_v

AS
  SELECT a FROM dbo.flarb;GO
ALTER TABLE dbo.flarb
    DROP CONSTRAINT DF__flarb__d__1B7E091A
GO
ALTER TABLE dbo.flarb
    DROP CONSTRAINT DF__flarb__e__1C722D53
GO
CREATE TABLE dbo.Tmp_flarb
    (
    a int NOT NULL,
    b int NOT NULL,
    d datetime NOT NULL,
    c timestamp NOT NULL,
    e uniqueidentifier NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_flarb SET (LOCK_ESCALATION = TABLE)
GO
ALTER TABLE dbo.Tmp_flarb ADD CONSTRAINT
    DF__flarb__d__1B7E091A DEFAULT (getdate()) FOR d
GO
ALTER TABLE dbo.Tmp_flarb ADD CONSTRAINT
    DF__flarb__e__1C722D53 DEFAULT (newsequentialid()) FOR e
GO
IF EXISTS(SELECT * FROM dbo.flarb)
     EXEC('INSERT INTO dbo.Tmp_flarb (a, b, d, e)
        SELECT a, b, d, e FROM dbo.flarb WITH (HOLDLOCK TABLOCKX)')
GO
ALTER TABLE dbo.blarf
    DROP CONSTRAINT FK__blarf__a__1E5A75C5
GO
DROP TABLE dbo.flarb
GO
EXECUTE sp_rename N'dbo.Tmp_flarb', N'flarb', 'OBJECT' 
GO
ALTER TABLE dbo.flarb ADD CONSTRAINT
    PK__flarb__3BD0198EF8B8CFAF PRIMARY KEY CLUSTERED 
    (
    a
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.flarb ADD CONSTRAINT
    CK__flarb__b__1A89E4E1 CHECK (([b]>(1)))
GO
CREATE TRIGGER dbo.flarb_tr
ON dbo.flarb
FOR UPDATE
AS
  SELECT 1;
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.blarf ADD CONSTRAINT
    FK__blarf__a__1E5A75C5 FOREIGN KEY
    (
    a
    ) REFERENCES dbo.flarb
    (
    a
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.blarf SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

Ja, das sieht wirklich nach etwas aus, das ich in der Produktion ausführen möchte , auch wenn der Tisch klein ist.

Die andere Alternative besteht darin, dies ganz manuell zu tun. Angenommen, Sie haben diese Tabelle:

CREATE TABLE dbo.Employee
(
  EmployeeID INT,
  Name NVARCHAR(255),
  Salary INT
);
INSERT ...

Theoretisch können Sie die Reihenfolge der Spalten "ändern", indem Sie für jede Spalte links von der Spalte, die Sie verschieben möchten, eine neue Spalte erstellen. Verschieben der Daten, Löschen der alten Spalte und Umbenennen der neuen Spalte. Dies funktioniert, weil die neue Spalte immer am "Ende" der Tabelle hinzugefügt wird. Auslassen der Fehlerbehandlung und anderer Komplikationen:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
ALTER TABLE dbo.Employee ADD Nametmp NVARCHAR(255);
UPDATE dbo.Employee SET Nametmp = Name;
ALTER TABLE dbo.Employee DROP COLUMN Name;
EXEC sp_rename N'dbo.Employee.Nametmp', N'Name', N'COLUMN';
COMMIT TRANSACTION;

Dies kann natürlich genauso störend (oder schlimmer) sein wie der Management Studio-Ansatz, bei dem nur die gesamte Tabelle ausgetauscht wird, und wird sehr kompliziert, wenn Sie mehr als eine Spalte verschieben möchten.

Nun, müssen Sie wirklich die Spaltenreihenfolge ändern ?

9
Aaron Bertrand

Sie können die scheinbar physische Spaltenreihenfolge in SSMS nicht ändern, ohne die Tabelle zu löschen und neu zu erstellen.

Warum nicht einfach die Abfrage ändern, um die Spalten in einer anderen Reihenfolge auszuwählen?

Von:

SELECT Eid, Ename, Esalary FROM Table

Zu:

SELECT Eid, Esalary, Ename FROM Table
2
Mark Sinkinson

Möchten Sie die zugrunde liegende Tabelle oder nur die Ergebnisse ändern?

Wenn es nur die Ergebnisse sind, ordnen Sie einfach Ihre select-Anweisung neu.

z.B. anstatt

SELECT Eid, Ename, Esalary FROM ThatTable;

verwenden

SELECT Eid, ESalary, EName FROM ThatTable;

Sie können auch eine Ansicht basierend auf dieser Tabelle einrichten, die in der gewünschten Reihenfolge ausgewählt wird.

Und wenn Sie es wirklich brauchen, können Sie die Tabelle einfach löschen und neu erstellen. Achten Sie nur darauf, die Daten zu exportieren und zu importieren, wenn Sie sie behalten möchten.

1
Mark

Extras> Optionen> Designer> Tabellen- und Datenbankdesigner> Deaktivieren Sie das Kontrollkästchen Speichern von Änderungen verhindern ...

Nach dem Speichern der Einstellungen können Sie jetzt Änderungen in der Entwurfsansicht einschließlich beweglicher Felder speichern

1

Es ist nicht "EINFACH" möglich. Sie können jedoch eine andere erstellen und dieselben Daten nach Belieben erneut einfügen. Am einfachsten ist es, die Reihenfolge der Operationsanweisungen zu ändern. Mögen:
SELECT Eid, Salary, Ename FROM TABLE;

0
Jann Claude