ALTER TABLE avec valeur DEFAULT constante déterminée par programme
-
20-08-2019 - |
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 !!!
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;