2 votes

Procédure stockée pour mettre à jour plusieurs tables

J'ai une procédure stockée qui met à jour deux tables. La première table est toujours la même, mais la seconde change en fonction d'un paramètre qui lui est passé. Est-il plus efficace d'écrire tout cela dans une seule et même procédure, comme suit

CREATE PROCEDURE MyBigProc
    @id int
    @param int,
    @value1 int,
    @value2 int
AS
BEGIN
    SET NOCOUNT ON;

    -- First table to update
    UPDATE MyTable SET field1 = @value1 WHERE id = @id

    -- Then choose which table to update based on @param
    IF @param = 1
       UPDATE MySecondTable SET field2 = @value2 WHERE id = @id

    IF @param = 2
       UPDATE MyThirdTable SET field2 = @value2 WHERE id = @id
END

Ou dois-je écrire une procédure distincte pour chaque table et appeler EXEC la procédure à partir de la procédure principale ?

Je suppose que la seconde solution est plus flexible, par exemple si je veux mettre à jour une table secondaire mais pas la table principale ?

1voto

Icarus Points 36951

Je suppose que la seconde solution est plus flexible, par exemple si je voulais mettre à jour un fichier sous-tableau mais pas le tableau principal ?

Exactement, vous avez une bonne raison de diviser le travail sur 2 procs séparés. Si cela a du sens pour vous pour tout le reste, je ne vois pas pourquoi ne pas suivre cette approche.

Une raison possible de ne pas le faire serait que les deux mises à jour doivent réussir ou échouer en même temps. Dans un tel scénario, je laisserais tout dans une seule proc et j'inclurais tout dans une seule transaction.

1voto

jainvikram444 Points 4237
CREATE PROCEDURE MyBigProc 
    @id int,
    @param int,
    @value1 int,
    @value2 int
AS
BEGIN
    SET NOCOUNT ON;

    -- First table to update
    UPDATE MyTable SET field1 = @value1 WHERE id = @id;

    -- Then choose which table to update based on @param
    IF @param = 1     
        exec SP_MySecondTable @id,@value2;
    IF @param = 2
       exec SP_MyThirdTable @id,@value2;
END

CREATE PROCEDURE SP_MySecondTable
    @id int, 
    @value2 int
AS
BEGIN  
    UPDATE MySecondTable SET field2 = @value2 WHERE id = @id;
END

CREATE PROCEDURE SP_MyThirdTable
    @id int, 
    @value2 int
AS
BEGIN  
  UPDATE MyThirdTable SET field2 = @value2 WHERE id = @id;
END

0voto

Raj Jayaswal Points 458

Il est préférable d'avoir différentes procédures stockées et de les appeler toutes à un seul endroit. Cela vous aidera beaucoup lors des activités de maintenance.

0voto

Immortal Points 368

La meilleure option est d'utiliser une instruction CASE pour mettre à jour vos tables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X