2010-09-28 4 views
3

Je voudrais appeler une procédure stockée "mise à jour" qui n'inclura pas nécessairement toutes les colonnes. Il y a probablement une meilleure façon de gérer cela .... Comme vous pouvez le voir, si je ne passe pas dans les paramètres de la colonne, leur valeur est NULL. Puis, en utilisant l'ISNULL, j'ai mis les colonnes soit à leurs nouvelles valeurs ou leurs valeurs existantes.Que se passe-t-il lorsque je mets à jour la colonne SQL? -OU- mises à jour conditionnelles simplifiées?

CREATE PROCEDURE [dbo].[spUpdateTable] 

@pPKID bigint = NULL, 
@pColumn1 int = NULL, 
@pColumn2 int = NULL 

AS 
BEGIN 

SET NOCOUNT ON; 

UPDATE 
    TableName 
SET 
    [Column1] = ISNULL(@pColumn1,[Column1]), 
    [Column2] = ISNULL(@pColumn2,[Column2]) 

WHERE 
    [PKID] = @pPKID 
END 
+0

Je sais ce qui se passe dans la base de données, ce que je veux dire est-ce qu'il y a des problèmes de performance ou de meilleures façons de le faire? – Matthew

Répondre

2

Ceci est fondamentalement la même chose que la réplication transactionnelle des procédures stockées font lors de la mise à jour d'une table sur un abonné. Si Microsoft le fait lui-même, il doit être sûr, non? :-)

Sérieusement, ma principale préoccupation ici serait des déclencheurs de mise à jour qui pourraient exister sur la table. Vous voudriez comprendre l'impact de la possibilité de déclencher ces déclencheurs sur ce qui pourrait être un non-changement. Sinon, je pense que votre technique est bonne.

+0

Bon rappel sur les déclencheurs de mise à jour. Bien que je n'utilisais délibérément aucun dans cette DB, je peux définitivement voir cela comme un obstacle pour certaines tables dans d'autres projets. Avez-vous des suggestions pour une autre méthode dans les cas où des déclencheurs de mise à jour existent? En outre, devrais-je être préoccupé par de tels déclencheurs dans les DB répliquées? – Matthew

+0

Si vous aviez besoin d'une alternative, vous pouviez tester chaque paramètre et construire l'instruction de mise à jour dans une chaîne que vous exécuteriez en tant que SQL dynamique. Voici le lien obligatoire vers [La malédiction et les bénédictions du SQL dynamique] (http://www.sommarskog.se/dynamic_sql.html). En ce qui concerne les déclencheurs dans une base de données répliquée, c'est probablement une discussion entièrement séparée. En guise d'exemple simple, si vous répliquez les tables A et B et que A possède un déclencheur inséré dans B, vous souhaiterez certainement désactiver ce même déclencheur sur l'abonné. –

+0

Cela prend tout son sens. J'ai déjà lu ce bit sur le SQL dynamique plusieurs fois (et j'aime éviter le SQL dynamique autant que possible) – Matthew

Questions connexes