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?
3 Réponses :
ISNULL
fonctionnera bien ici:
UPDATE [dbo].[State] SET Bar = @Bar, Something = ISNULL(@Something,Something) WHERE...
COALESCE le fera pour vous!
UPDATE [dbo].[State] SET Bar = @Bar, Something = COALESCE(@Something,Something) WHERE (--condition--)
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--)