43 votes

Appel d'une procédure stockée à partir d'une autre procédure stockée SQL Server

J'ai 3 procédures stockées d'insertion, chaque procédure insère des données dans 2 tables différentes.

Table 1          Table 2                
idPerson         idProduct             
name             productName            
phoneNumber      productdescription     
FK-idProduct

SP pour le tableau 1 SP pour le tableau 2

create procedure test1                create procedure test2
WITH                                  WITH 
EXECUTE as caller                     EXECUTE as caller
AS                                    AS
declare                               declare

@idPerson int,                        @idProduct int,
@name varchar(20),                    @productName varchar(50),
@phone varchar(20)                    @productoDescription varchar(50)

  SET nocount on;                     SET nocount on;
    Begin                             Begin
      insert into table1(                insert into table2(
                idPerson,                          idProduct,
                name,                              productName,
                phone)                             productDescription)
          values(                            values(
                @idPerson,                         @idProduct,
                @name,                             @productName,
                @phone)                            @productDescription)
      end                               end

Je dois appeler la procédure stockée test 2 à partir de la procédure stockée test 1 et insérer le FK-ID dans la table 1.

38voto

Mark Kadlec Points 1938

Il suffit d'appeler test2 de test1 comme :

EXEC test2 @newId, @prod, @desc;

Assurez-vous d'obtenir @id en utilisant SCOPE_IDENTITY(), qui récupère la dernière valeur d'identité insérée dans une colonne d'identité dans la même portée :

SELECT @newId = SCOPE_IDENTITY()

8voto

AdaTheDev Points 53358

Vous pourriez ajouter un paramètre OUTPUT à test2, et le définir sur le nouvel identifiant directement après l'utilisation de l'INSERT :

SELECT @NewIdOutputParam = SCOPE_IDENTITY()

Puis dans test1, récupérez-le comme ceci :

DECLARE @NewId INTEGER
EXECUTE test2 @NewId OUTPUT
-- Now use @NewId as needed

0voto

Sergio Rosas Points 515

Tout d'abord, si table2 est une identité, vous ne pouvez pas l'insérer explicitement tant que vous n'avez pas défini l'option IDENTITY_INSERT sur cette table

SET IDENTITY_INSERT table2 ON;

avant l'insertion.

Donc, de deux choses l'une, vous modifiez votre deuxième stocké et l'appelez avec seulement les paramètres productName y productDescription et ensuite obtenir le nouvel identifiant

EXEC test2 'productName', 'productDescription'
SET @newID = SCOPE_IDENTIY()

ou vous avez déjà l'ID du produit et vous n'avez pas besoin d'appeler SCOPE_IDENTITY() et peut faire l'insertion sur table1 avec cet ID

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