2012-01-13 31 views
26

tengo 3 procedimientos de inserción almacena cada datos inserta SP en 2 tablas diferentesLlamar a procedimiento almacenado de otro SQL procedimiento almacenado del servidor

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

SP para la tabla 1 SP para la tabla 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 

necesito llamar al procedimiento almacenado prueba 2 desde el procedimiento almacenado prueba 1 e insertar el FK-ID en la tabla 1

Respuesta

21

Simplemente llame al test2 desde test1 como:

EXEC test2 @newId, @prod, @desc; 

Asegúrese de obtener @id usando:

SELECT @newId = @@SCOPE_IDENTITY 
+0

¿hará la inserción de idPerson, nombre, teléfono e idProduct en la tabla 1 y idProduct, productName y productDescription en la tabla 2? –

+0

@@ SCOPE_IDENTITY no es una cosa. Use SCOPE_IDENTITY() – MPaul

6

Se podría añadir un parámetro OUTPUT a test2, y la pusieron a la nueva identificación inmediatamente después del INSERT usando:

SELECT @NewIdOutputParam = SCOPE_IDENTITY() 

Luego, en test1, recupérelo así:

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

Tenga en cuenta que no se puede confiar en SCOPE_IDENTITY() para obtener resultados precisos a menos que use MAX_DOP = 1 en versiones de SQL anteriores a 2012. (Consulte aquí: http://connect.microsoft.com/SQLServer/feedback/ detalles/328811 /) –

0

En primer lugar, si idProduct table2 's es una identidad, no se puede insertar de forma explícita hasta que ajuste IDENTITY_INSERT en esa mesa

SET IDENTITY_INSERT table2 ON; 

antes de la inserción.

Así que una de dos, modificar su segunda almacena y se llama con sólo los parámetros productName y productDescription y luego obtener el nuevo ID

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

o que ya tiene el ID del producto y usted don' t necesita llamar al SCOPE_IDENTITY() y puede hacer la inserción en table1 con esa ID

Cuestiones relacionadas