ALTER TABLE mit Software bestimmten konstanten Wert DEFAULT
-
20-08-2019 - |
Frage
Ich versuche, eine Spalte (MSSQL 2005) auf einen Tisch (Employee) mit einer Standardeinschränkung eines Primärschlüssels einer anderen Tabelle (Abteilung) hinzuzufügen. Dann werde ich in dieser Spalte ein FK auf diese Tabelle machen. Im Wesentlichen wird diese neue Mitarbeiter der Abteilungsnamen zu einer Basis Abteilung zuweisen Basis aus, wenn keine DepartmentID vorgesehen ist.
Dies funktioniert nicht:
DECLARE @ErrorVar INT
DECLARE @DepartmentID INT
SELECT @DepartmentID = DepartmentID
FROM Department
WHERE RealName = 'RocketScience'
ALTER TABLE [Employee]
ADD [DepartmentID] INT NULL
CONSTRAINT [DepartmentIDOfAssociate] DEFAULT (@DepartmentIDAssociate)
SELECT @ErrorVar = @@Error
IF (@ErrorVar <> 0)
BEGIN
GOTO FATAL_EXIT
END
Die Produktion, Test und Entwicklung Datenbanken aus dem Takt und die DepartmentID für den Department = ‚Rocketscience‘ gewachsen kann oder auch nicht gleich sein, so will ich nicht nur DEFAULT (somenumber) sagen. Ich halte immer „Variablen werden in der ALTEN TABLE-Anweisung nicht zulässig“ unabhängig davon, welche Art und Weise ich das Problem angreifen.
Was ist der richtige Weg, dies zu tun? Ich habe versucht, auch die Select-Anweisung verschachteln, die „Unterabfragen sind nicht erlaubt in diesem Zusammenhang bekommt. Nur skalare Ausdrücke sind nicht zulässig.“
Außerdem was wäre wirklich toll, ich die Spaltenwerte in einer Anweisung füllen könnte, anstatt die
tut {null ALTE}
{Werte aktualisieren}
{ALTER nicht null}
Schritte. Ich las etwas über die MIT-Sollwert aber konnte es nicht zu arbeiten.
Dank !!!
Lösung
Sie können den Code wickeln Sie Ihre Abteilungs-ID in eine gespeicherte Funktion zu finden, und dass in Ihrer Standard-Constraint-Anweisung verwenden:
CREATE FUNCTION dbo.GetDepartment()
RETURNS INT
AS
BEGIN
DECLARE @DepartmentID INT
SELECT @DepartmentID = DepartmentID
FROM Department
WHERE RealName = 'RocketScience'
RETURN @DepartmentID
END
Und dann:
ALTER TABLE [Employee]
ADD [DepartmentID] INT NULL
CONSTRAINT [DepartmentIDOfAssociate] DEFAULT (dbo.GetDepartment())
Ist diese Hilfe?
Marc
Andere Tipps
Die akzeptierte Antwort funktionierte prima (Danke marc_s), aber nachdem ich darüber nachgedacht, eine Zeit lang habe ich beschlossen, einen anderen Weg zu gehen.
Vor allem, weil es hat eine Funktion auf dem Server belassen werden, die ich denke, endet genannt werden jedes Mal, wenn ein Mitarbeiter hinzugefügt wird.
Wenn jemand mit der Funktion messed später dann kann niemand einen Mitarbeiter eingeben und der Grund nicht offensichtlich.
(Auch wenn das nicht wahr ist, dann gibt es noch zusätzliche Funktionen auf dem Server, die nicht da sein müssen)
Was ich tat, war der Befehl dynamisch in einer Variablen zusammenstellen und dann rufen, dass der Befehl ausgeführt werden.
Nicht nur das, aber da ich das Standard-Schlüsselwort verwendet mit NICHT die Tabelle NULL wurde wieder aufgefüllt und ich habe, um mehrere Befehle, um es getan nicht ausgeführt werden. Ich fand, dass eine von Glück ...
DECLARE @ErrorVar INT
DECLARE @DepartmentIDRocketScience INT
DECLARE @ExecuteString NVARCHAR(MAX)
SELECT @DepartmentIDRocketScience = DepartmentID
FROM Department
WHERE RealName = 'RocketScience'
SET @ExecuteString = ''
SET @ExecuteString = @ExecuteString + 'ALTER TABLE [Employee] '
SET @ExecuteString = @ExecuteString + 'ADD [DepartmentID] INT NOT NULL '
SET @ExecuteString = @ExecuteString + 'CONSTRAINT [DF_DepartmentID_RocketScienceDepartmentID] DEFAULT ' +CAST(@DepartmentIDAssociate AS NVARCHAR(MAX))
EXECUTE (@ExecuteString)
SELECT @ErrorVar = @@Error
IF (@ErrorVar <> 0)
BEGIN
GOTO FATAL_EXIT
END
Wenn Sie Ihren Fremdschlüssel anwenden, nachdem Sie die Spalte hinzufügen, können Sie einen beliebigen Wert für den Standardwert verwenden, wenn die Tabelle zu ändern. Dann können Sie eine Update-Anweisung mit dem Variablenwert ausgeführt werden.
ALTER TABLE Employee
ADD DepartmentID INT NOT NULL
Default -1;
UPDATE Employee
SET Employee.DepartmentID = @DepartmentID
WHERE DepartmentID = -1;
ALTER TABLE Employee
ADD CONSTRAINT fk_employee_to_department FOREIGN KEY (DepartmentID)
REFERENCES Department;