1
votes

MISE À JOUR SQL Server: définir la colonne si le paramètre n'est pas nul

J'ai une procédure stockée destinée à insérer ou à mettre à jour dans une table selon qu'il existe ou non une valeur pour une colonne. Cela fonctionne bien sauf que je ne veux définir la valeur de certaines colonnes que si un paramètre a été passé. C'est parce que je ne veux pas remplacer la valeur de la colonne existante par null.

Voici une idée de la procédure stockée:

UPDATE [dbo].[State]
SET Bar = @Bar, 
    IF (@Something IS NOT NULL) Something = @Something
 WHERE (--condition--)

J'essaye d'accomplir quelque chose comme ceci:

CREATE PROCEDURE [dbo].[p_SaveState]
   @Foo             nvarchar(50),
   @Bar             nvarchar(20) = null,
   @Something       nvarchar(20) = null
AS
BEGIN
   IF EXISTS (SELECT TOP(1) Foo FROM dbo.[State] WHERE Bar = @Bar)
   BEGIN
       UPDATE [dbo].[State]
       SET Bar = @Bar, 
           Something = @Something
       WHERE (--condition--)
   END
   ELSE
   BEGIN
      ... -- INSERT statement goes here

Mais je ne pense pas pouvoir utiliser CASE car je n'ai pas la valeur d'origine à définir sans effectuer une sélection.

Comment puis-je obtenir cet effet?


0 commentaires

3 Réponses :


5
votes

ISNULL fonctionnera bien ici:

UPDATE [dbo].[State]
SET Bar = @Bar, 
    Something = ISNULL(@Something,Something)
WHERE...


0 commentaires

2
votes

COALESCE le fera pour vous!

UPDATE [dbo].[State]
SET Bar = @Bar, 
    Something = COALESCE(@Something,Something)
WHERE (--condition--)


0 commentaires

2
votes

Vous pourriez utiliser CASE , comme ceci ...

UPDATE [dbo].[State]
SET Bar = @Bar, 
    Something = ISNULL(@Something, Something)
WHERE (--condition--)

Cela définira la valeur de Something code> à la valeur de votre variable si elle est NOT NULL , mais utilisera la valeur d'origine si elle est NULL .

La même chose peut être obtenue de manière plus concise en utilisant ISNULL cependant, comme ceci:

UPDATE [dbo].[State]
SET Bar = @Bar, 
    Something = CASE WHEN @Something IS NOT NULL THEN @Something ELSE Something END
WHERE (--condition--)


0 commentaires