Wie füge ich einer SQL Server-Tabelle eine Spalte mit einem Standardwert hinzu, der dem Wert einer vorhandenen Spalte entspricht?
Ich habe diese T-SQL-Anweisung ausprobiert:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
aber es gibt einen Fehler:
Der Name "oldcolumn" ist in diesem Zusammenhang nicht zulässig. Gültige Ausdrücke sind Konstanten, konstante Ausdrücke und (in einigen Kontexten) Variablen. Spaltennamen sind nicht zulässig.
sql
sql-server-2008
Doesdos
quelle
quelle
UPDATE
, fürchte ich.Antworten:
Versuche dies:
quelle
Ich mag sie nicht sehr, aber hier ist, wie Sie dies mit einem
AFTER INSERT
Auslöser tun können :quelle
Der
AFTER INSERT
Trigger-Ansatz ist aufgrund der zusätzlichenUPDATE
Anweisung mit einem Overhead verbunden . Ich schlage vor, einenINSTEAD OF INSERT
Auslöser wie folgt zu verwenden:Dies funktioniert jedoch nicht, wenn
oldcolumn
es sich um eine Spalte mit automatischer Identität handelt.quelle
INSTEAD OF
Trigger funktionieren auch nicht, wennSYSTEM_VERSIONING = ON
Versuchen Sie Folgendes , um Kapils Antwort zu erweitern und die unerwünschte Standardeinschränkung zu vermeiden:
Ersetzen Sie -9999 durch 'noData', wenn Ihr Typ varchar, nvarchar, datetime, ... oder durch kompatible Daten für andere Typen ist: Ein bestimmter Wert spielt keine Rolle, er wird durch die 2. Anweisung gelöscht.
quelle
Sie können eine berechnete Spalte verwenden, um eine neue Spalte basierend auf einem vorhandenen Spaltenwert in eine Tabelle einzufügen
ODER, wenn Sie einige Änderungen am Wert basierend auf dem vorhandenen Spaltenwert vornehmen möchten, verwenden Sie
quelle
In meinem Fall möchte ich eine neue, nicht null eindeutige Spalte mit dem Namen CODE hinzufügen, aber ich weiß nichts über den Wert zum Zeitpunkt der Erstellung. Ich habe den Standardwert dafür festgelegt, indem ich einen Standardwert von NewID () erhalten und später aktualisiert habe.
quelle
Ich denke, es wird funktionieren, wenn Sie
Set Identity_Insert <TableName> OFF
und nach der Einfügeanweisung, die Sie geschrieben haben, nur verwendenSet Identity_Insert <TableName> ON
.quelle