web-dev-qa-db-fra.com

Utilisation de UPDATE dans une procédure stockée avec des paramètres facultatifs

J'ai un SP comme ceci (avec SQL Server):

ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
    @id uniqueidentifier,
    @ordering smallint = NULL,
    @title nvarchar(20) = NULL,
    @content text = NULL
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE tbl_ClientNotes
    SET ordering=@ordering, title=@title, content=@content
    WHERE id=@id
END

Je souhaite définir les valeurs uniquement si elles sont transmises au SP, c’est-à-dire non NULL. Cela peut-il être fait?

Cette question semble suggérer le seul moyen d'utiliser des requêtes complètement séparées avec des conditions, mais pour 3 paramètres facultatifs, ce serait évidemment un cauchemar!

23
DisgruntledGoat

Essaye ça.

ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
    @id uniqueidentifier,
    @ordering smallint = NULL,
    @title nvarchar(20) = NULL,
    @content text = NULL
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE tbl_ClientNotes
    SET ordering=ISNULL(@ordering,ordering), 
        title=ISNULL(@title,title), 
        content=ISNULL(@content, content)
    WHERE id=@id
END

Cela pourrait également valoir la peine d’ajouter une partie supplémentaire à la clause WHERE. Si vous utilisez la réplication transactionnelle, il enverra une autre mise à jour à l’abonné si toutes sont NULL, pour éviter cela.

WHERE id=@id AND (@ordering IS NOT NULL OR
                  @title IS NOT NULL OR
                  @content IS NOT NULL)
38
Chris Diver
   UPDATE tbl_ClientNotes
    SET 
      ordering=ISNULL@ordering,ordering), 
      title=isnull(@title,title), 
      content=isnull(@content,content)
    WHERE id=@id

Je pense me souvenir d’avoir déjà vu que, si vous effectuez une mise à jour avec la même valeur, SQL Server le reconnaîtra et ne fera pas d’écriture inutile.

3
Martin Smith

Une idée:

UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title),  content=ISNULL(@content, content)
WHERE id=@id
3
Ian Jacobs
UPDATE tbl_ClientNotes 
SET ordering=@ordering, title=@title, content=@content 
WHERE id=@id 
AND @ordering IS NOT NULL
AND @title IS NOT NULL
AND @content IS NOT NULL

Ou si vous vouliez seulement mettre à jour des colonnes individuelles, vous utiliseriez la publication au-dessus de la mienne. Je le lis comme ne pas mettre à jour si des valeurs sont nulles

0
FlyingStreudel