Je pense que je suis en quelque sorte proche de le faire fonctionner, mais pour une raison quelconque, je reçois toujours des erreurs.
J'ai la requête UPDATE suivante:
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' THEN @Accessories
WHEN 'Description' THEN @Description
WHEN 'Specification' THEN @Specification
ELSE Details
END
WHERE DeviceID = 10
Les paramètres sont renseignés par différents utilisateurs. Le problème auquel je suis confronté maintenant est que même lorsque vous souhaitez mettre à jour un seul champ, vous devez toujours remplir avec les anciennes données les autres paramètres. Par conséquent, je voudrais définir l'option IF @parameter IS NULL THEN garder la valeur qui est déjà stockée dans la base de données. J'ai essayé de trouver une solution et quelque chose comme la requête suivante semble être le solution mais je ne peux pas le faire fonctionner:
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' IS NOT NULL THEN @Accessories
WHEN 'Description' IS NOT NULL THEN @Description
WHEN 'Specification' IS NOT NULL THEN @Specification
ELSE Details
END
WHERE DeviceID = 10
LA BD est stockée dans SQL Server 2008
Merci d'avance pour l'aide.
EDIT pour clarifier:
La table d'origine ressemble à ceci
DeviceID|Name |Details |
10 |Accessories |earplugs |
10 |Description |protectors|
10 |Specification|BeatsByDre|
Pour des raisons de publication, j'ai fait une requête pour renverser la vapeur. Ainsi, lorsque la requête Select est exécutée, la table de retour ressemble à ce qui suit
DeviceID|Accessories|Description|Specification|
10 |earplugs |protectors |BeatsByDre |
J'ai créé une interface utilisateur pour permettre aux utilisateurs du système de mettre à jour les différents champs tels que Accessoires, Description, Spécifications. La mise à jour fonctionne si je mets à jour tous les champs avec la requête affichée en haut. Cependant, lorsque je laisse une zone de texte vide, j'obtiens une erreur indiquant que le @parameter manque une valeur. Donc, essayer de trouver une solution pour mettre à jour uniquement le champ où est écrit quelque chose. Donc, si @parameter IS NULL, conservez la valeur d'origine dans la base de données. J'ai trouvé une autre solution qui est vraiment proche de ce que je veux mais ne peut pas le faire fonctionner. Voici l'autre solution : https://stackoverflow.com/questions/9387839/mysql-if-not-null-then-display-1-else-display-
Je pense que cela résoudra le problème:
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' THEN COALESCE(@Accessories, Details)
WHEN 'Description' THEN COALESCE(@Description, Details)
WHEN 'Specification' THEN COALESCE(@Specification, Details)
ELSE Details
END
WHERE DeviceID = 10 ;
ou ceci (pour éviter les mises à jour redondantes):
UPDATE DeviceAttribute
SET Details = CASE Name
WHEN 'Accessories' THEN @Accessories
WHEN 'Description' THEN @Description
WHEN 'Specification' THEN @Specification
ELSE Details
END
WHERE DeviceID = 10
AND ( Name = 'Accessories' AND @Accessories IS NOT NULL
OR Name = 'Description' AND @Description IS NOT NULL
OR Name = 'Specification' AND @Specification IS NOT NULL
) ;
ou ceci, en utilisant un constructeur de valeur de table:
UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
JOIN
( VALUES
('Accessories' , @Accessories),
('Description' , @Description),
('Specification' , @Specification)
) AS upd (Name, Details)
ON upd.Name = da.Name
WHERE da.DeviceID = 10
AND upd.Details IS NOT NULL ;