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!
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)
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.
Une idée:
UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title), content=ISNULL(@content, content)
WHERE id=@id
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