SI NON NUL, alors MISE À JOUR, sinon conservez la valeur du champ

10

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 la solution mais je ne peux pas la 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 je ne peux pas le faire fonctionner. Voici l'autre solution: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0

Jeunot
la source
Pouvez-vous fournir cette erreur exacte? S'agit-il d'une erreur SQL-Server ou d'une erreur dans votre application (UI)? Quelle UPDATEinstruction l'interface utilisateur envoie-t-elle à la base de données?
ypercubeᵀᴹ
Pouvez-vous ajouter cela dans la question? Il peut s'agir de la façon dont l'énoncé est construit et des guillemets utilisés. Cela '@'Accessoriesn'a pas de sens pour moi.
ypercubeᵀᴹ
1
Je pense que votre code d'interface utilisateur ne produit peut-être pas de déclarations valides. Montrez-nous le code que vous avez et produit l'erreur, pas le pseudo-code.
ypercubeᵀᴹ
Je tiens à vous remercier de votre aide. Désolé pour mon manque d'expérience. J'ai réussi à trouver l'erreur, et vous aviez raison, le problème était au niveau de l'interface utilisateur. Merci beaucoup pour l'aide. Dans le cas où quelqu'un cherche une réponse similaire, j'ai utilisé la première solution
Greenhorn

Réponses:

13

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 ;
ypercubeᵀᴹ
la source
Merci pour la réponse rapide. Je vais l'essayer et vous informer du résultat.
Greenhorn
Vous voulez dire la 2ème solution dans ma réponse?
ypercubeᵀᴹ
oui, j'essaye la 3ème solution, j'ai surévalué les réponses car ça donne plein de possibilités. Je ty le 3ème et si je le fais fonctionner je l'accepterai aussi.
Greenhorn
Tout devrait fonctionner. Si ce n'est pas le cas, vous pouvez modifier votre question et ajouter la structure de la table (instruction Create Table) et la procédure stockée. Il y a peut-être quelque chose de pertinent que je comprends mal ou que vous n'avez pas mentionné.
ypercubeᵀᴹ
Si ces réponses fonctionnent lorsque tous les paramètres ne sont pas nuls, mais ne fonctionnent pas lorsque l'un d'entre eux est nul, regardez le code de l'interface utilisateur et comment il gère null lors de la production de la requête. Et vous pouvez ajouter ce code (UI) à la question.
ypercubeᵀᴹ