Question

J'essaie d'ajouter une colonne (MSSQL 2005) à une table (Employee) avec une contrainte par défaut d'une clé primaire d'une autre table (Department). Ensuite, je vais faire de cette colonne un FK pour cette table. Cela affectera essentiellement les nouveaux employés à un département de base basé sur le nom du département si aucun DepartmentID n'est fourni.
Cela ne fonctionne pas:

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

Les bases de données de production, de test et de développement ne sont plus synchronisées et l'ID de département correspondant à DepartmentName = & # 8216; RocketScience & # 8217; peut ne pas être la même chose, donc je ne veux pas simplement dire DEFAULT (numéro). Je continue à recevoir & 8282; les variables ne sont pas autorisées dans l'instruction ALTER TABLE & # 8221; peu importe de quelle manière j'attaque le problème.
Quelle est la bonne façon de faire cela? J'ai également essayé d'imbriquer l'instruction select qui obtient & # 8220; Les sous-requêtes ne sont pas autorisées dans ce contexte. Seules les expressions scalaires sont autorisées. & # 8221;

En outre, ce qui serait vraiment génial, je pourrais renseigner les valeurs de colonne dans une instruction au lieu de procéder de la manière suivante:

{ALTER null}
{Mise à jour des valeurs}
{ALTER pas null}

étapes. J'ai lu quelque chose sur la commande WITH VALUES mais je ne pouvais pas le faire fonctionner. Merci !!!

Était-ce utile?

La solution

Vous pouvez insérer le code pour trouver votre numéro de service dans une fonction stockée et l'utiliser dans votre déclaration de contrainte DEFAULT:

CREATE FUNCTION dbo.GetDepartment()
RETURNS INT
AS
BEGIN
  DECLARE         @DepartmentID           INT

  SELECT          @DepartmentID = DepartmentID
  FROM            Department
  WHERE           RealName = 'RocketScience'

  RETURN @DepartmentID
END

Et ensuite:

ALTER TABLE     [Employee]
ADD                     [DepartmentID] INT NULL
CONSTRAINT      [DepartmentIDOfAssociate] DEFAULT (dbo.GetDepartment())

Est-ce que cela vous aide?

Marc

Autres conseils

La réponse acceptée a très bien fonctionné (Merci, marc_s), mais après y avoir réfléchi pendant un moment, j'ai décidé de changer de voie.
Principalement parce qu'il doit rester une fonction sur le serveur qui finit par être appelée chaque fois qu'un employé est ajouté.
Si quelqu'un se mêlait de la fonction plus tard, personne ne pourrait entrer un employé et la raison ne serait pas évidente. (Même si ce n'est pas vrai, il reste des fonctions supplémentaires sur le serveur qui n'ont pas besoin d'être présentes)

Ce que j'ai fait était d'assembler la commande de manière dynamique dans une variable, puis de l'appeler à l'aide de la commande EXECUTE.

Non seulement cela, mais puisque j'ai utilisé le mot clé DEFAULT avec NOT NULL, la table a été remplie et je n'ai pas eu à exécuter plusieurs commandes pour le faire. J'ai découvert celui-là par hasard ...

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

Si vous appliquez votre contrainte de clé étrangère après avoir ajouté la colonne, vous pouvez utiliser n'importe quelle valeur pour la valeur par défaut lors de la modification de la table. Ensuite, vous pouvez exécuter une instruction update avec votre valeur de variable.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top