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 !!!

War es hilfreich?

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