none
duda de exec RRS feed

  • Pregunta

  • Hola:

    Tengo un procedimiento almacenado,sp1, cuyos parámetros son

    	(
    	@obra tinyint,
    	@id0 int,
    	@idioma tinyint=1,
    	@nombre nvarchar(25)='' output,
    	@apellidos nvarchar(25)='' output,
    	@c10 int=0 output,
    	@correo nvarchar(80)='' output,
    	@tipoidentificacion nvarchar(25)='' output,
    	@identificacion nvarchar(15)='' output,
    	@region nvarchar(25)='' output,
    	@direccion nvarchar(50)='' output,
    	@localidad nvarchar(25)='' output,
    	@pais nvarchar(25)='' output,
    	@npais int=0 output,
    	@moneda_singular nvarchar(25)='' output,
    	@moneda_plural nvarchar(25)='' output
    	)
    

    Quiero llamarlo desde otro procedimiento usando los parámetros de entrada @obra, @id0, y de salida @moneda_singular, @moneda_plural

    ¿cómo lo llamo? Hago

    exec sp1 18,12,@moneda_singular out,@moneda_plural out

    Pero no sé si coge bien los parámetros

    ¿Podéis ayudarme?

    Muchísimas gracias

    lunes, 29 de abril de 2019 20:41

Respuestas

  • Hola volar.2016:

    No funciona así.

    Si tú tienes declarados 10 parámetros como out, el esta esperando 10 parámetros out.

    CREATE TABLE [dbo].[REGISTROSLOG](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[obra] [tinyint] NULL,
    	[id0] [int] NULL,
    	[idioma] [tinyint] NULL,
    	[nombre] [nvarchar](25) NULL,
    	[apellidos] [nvarchar](25) NULL,
    	[c10] [int] NULL,
    	[correo] [nvarchar](80) NULL,
    	[tipoidentificacion] [nvarchar](25) NULL,
    	[identificacion] [nvarchar](15) NULL,
    	[region] [nvarchar](25) NULL,
    	[direccion] [nvarchar](50) NULL,
    	[localidad] [nvarchar](25) NULL,
    	[pais] [nvarchar](25) NULL,
    	[npais] [int] NULL,
    	[moneda_singular] [nvarchar](25) NULL,
    	[moneda_plural] [nvarchar](25) NULL
    ) ON [PRIMARY]
    GO
    /* CREO ESTA TABLA PARA SABER LO QUE OCURRE */

    PROCEDIMIENTO 1

    CREATE PROCEDURE llamada1
    ( @obra               TINYINT
    , @id0                INT
    , @idioma             TINYINT      = 1
    , @nombre             NVARCHAR(25) = '' OUTPUT
    , @apellidos          NVARCHAR(25) = '' OUTPUT
    , @c10                INT          = 0  OUTPUT
    , @correo             NVARCHAR(80) = '' OUTPUT
    , @tipoidentificacion NVARCHAR(25) = '' OUTPUT
    , @identificacion     NVARCHAR(15) = '' OUTPUT
    , @region             NVARCHAR(25) = '' OUTPUT
    , @direccion          NVARCHAR(50) = '' OUTPUT
    , @localidad          NVARCHAR(25) = '' OUTPUT
    , @pais               NVARCHAR(25) = '' OUTPUT
    , @npais              INT          = 0  OUTPUT
    , @moneda_singular    NVARCHAR(25) = '' OUTPUT
    , @moneda_plural      NVARCHAR(25) = '' OUTPUT
    )								
    AS
        BEGIN TRY
        INSERT INTO REGISTROSLOG(obra             , id0                
    , idioma             , nombre             , apellidos          , c10                
    , correo             , tipoidentificacion , identificacion     , region             
    , direccion          , localidad          , pais               , npais              
    , moneda_singular    , moneda_plural      )
    VALUES 
    ( @obra               
    , @id0                
    , @idioma             
    , @nombre             
    , @apellidos          
    , @c10                
    , @correo             
    , @tipoidentificacion 
    , @identificacion     
    , @region             
    , @direccion          
    , @localidad          
    , @pais               
    , @npais              
    , @moneda_singular    
    , @moneda_plural      
    );
    
    
    END TRY
    BEGIN CATCH
        
         DECLARE @ErrorMessage NVARCHAR(4000);  
        DECLARE @ErrorSeverity INT;  
        DECLARE @ErrorState INT;  
      
        SELECT   
            @ErrorMessage = ERROR_MESSAGE(),  
            @ErrorSeverity = ERROR_SEVERITY(),  
            @ErrorState = ERROR_STATE();  
        RAISERROR (@ErrorMessage,
                   @ErrorSeverity,
                   @ErrorState); 
    
    END CATCH
        
    GO
    


    Defino el procedimiento, como tu indicas, pero observa la "jugada", yo defino los parámetros de salida con un valor, por defecto, pero como para poder invocar al procedure, tengo que pasárselos. por posición, y si se los paso nominales, no me deja hacerlos out. 

    Para ello tendría que recurrir a exec sp_executeSql y definirlos dentro de una variable que le indique los parámetros.

    La opción más fácil, es que les des la vuelta, y que pongas, primero en el procedimiento receptor, después de los parámetros obligatorios, los que serán de salida, en este caso, moneda singular y plural.

        DECLARE   @obra               TINYINT
    		  , @id0                INT
    		  , @idioma             TINYINT      
    		  , @nombre             NVARCHAR(25) 
    		  , @apellidos          NVARCHAR(25) 
    		  , @c10                INT          
    		  , @correo             NVARCHAR(80) 
    		  , @tipoidentificacion NVARCHAR(25) 
    		  , @identificacion     NVARCHAR(15) 
    		  , @region             NVARCHAR(25) 
    		  , @direccion          NVARCHAR(50) 
    		  , @localidad          NVARCHAR(25) 
    		  , @pais               NVARCHAR(25) 
    		  , @npais              INT          
    		  , @moneda_singular    NVARCHAR(25) 
    		  , @moneda_plural      NVARCHAR(25) ;
    
    
    
    	   EXEC dbo.llamada1 
    		  18
    	    ,  12
    	    , 1
    	    --, @NOMBRE 	 outPUT
    	    --, @apellidos outPUT
    	    --, @c10  outPUT
    	    --, @correo out
    	    --, @tipoidentificacion  out
    	    --, @identificacion  out 
    	    --, @region  out
    	    --, @direccion  out 
    	    --, @localidad  out
    	    --, @pais out
    	    --, @npais out
    	    , @moneda_singular out
    	    , @moneda_plural  out;
    
    	   SELECT @idioma
    		   , @NOMBRE
    		   , @apellidos
    		   , @c10
    		   , @correo
    		   , @tipoidentificacion
    		   , @identificacion
    		   , @region
    		   , @direccion
    		   , @localidad
    		   , @pais
    		   , @npais
    		   , @moneda_singular
    		   , @moneda_plural;
    
    
        SELECT * FROM REGISTROSLOG;


    Si ejecutas el código que te he puesto, verás que toma los parámetros por posición, y va insertando nulos conforme a cuantos parámetros de salida le definas.

    La solución fácil

    ALTER PROCEDURE llamada1
    ( @obra               TINYINT
    , @id0                INT
    , @idioma             TINYINT      = 1
    , @moneda_singular    NVARCHAR(25) = '' OUTPUT
    , @moneda_plural      NVARCHAR(25) = '' OUTPUT
    , @nombre             NVARCHAR(25) = '' OUTPUT
    , @apellidos          NVARCHAR(25) = '' OUTPUT
    , @c10                INT          = 0  OUTPUT
    , @correo             NVARCHAR(80) = '' OUTPUT
    , @tipoidentificacion NVARCHAR(25) = '' OUTPUT
    , @identificacion     NVARCHAR(15) = '' OUTPUT
    , @region             NVARCHAR(25) = '' OUTPUT
    , @direccion          NVARCHAR(50) = '' OUTPUT
    , @localidad          NVARCHAR(25) = '' OUTPUT
    , @pais               NVARCHAR(25) = '' OUTPUT
    , @npais              INT          = 0  OUTPUT
    )								
    AS
        BEGIN TRY
        INSERT INTO REGISTROSLOG(obra             , id0                
    , idioma             , nombre             , apellidos          , c10                
    , correo             , tipoidentificacion , identificacion     , region             
    , direccion          , localidad          , pais               , npais              
    , moneda_singular    , moneda_plural      )
    VALUES 
    ( @obra               
    , @id0                
    , @idioma             
    , @nombre             
    , @apellidos          
    , @c10                
    , @correo             
    , @tipoidentificacion 
    , @identificacion     
    , @region             
    , @direccion          
    , @localidad          
    , @pais               
    , @npais              
    , @moneda_singular    
    , @moneda_plural      
    );
    
    
    END TRY
    BEGIN CATCH
        
         DECLARE @ErrorMessage NVARCHAR(4000);  
        DECLARE @ErrorSeverity INT;  
        DECLARE @ErrorState INT;  
      
        SELECT   
            @ErrorMessage = ERROR_MESSAGE(),  
            @ErrorSeverity = ERROR_SEVERITY(),  
            @ErrorState = ERROR_STATE();  
        RAISERROR (@ErrorMessage,
                   @ErrorSeverity,
                   @ErrorState); 
    
    END CATCH
        
    GO
    


    Llamada

        DECLARE   @obra               TINYINT
    		  , @id0                INT
    		  , @idioma             TINYINT      
    		  , @nombre             NVARCHAR(25) 
    		  , @apellidos          NVARCHAR(25) 
    		  , @c10                INT          
    		  , @correo             NVARCHAR(80) 
    		  , @tipoidentificacion NVARCHAR(25) 
    		  , @identificacion     NVARCHAR(15) 
    		  , @region             NVARCHAR(25) 
    		  , @direccion          NVARCHAR(50) 
    		  , @localidad          NVARCHAR(25) 
    		  , @pais               NVARCHAR(25) 
    		  , @npais              INT          
    		  , @moneda_singular    NVARCHAR(25) 
    		  , @moneda_plural      NVARCHAR(25) ;
    
    
    
    	   EXEC dbo.llamada1 
    		  18
    	    ,  12
    	    , 1
    	    --, @NOMBRE 	 outPUT
    	    --, @apellidos outPUT
    	    --, @c10  outPUT
    	    --, @correo out
    	    --, @tipoidentificacion  out
    	    --, @identificacion  out 
    	    --, @region  out
    	    --, @direccion  out 
    	    --, @localidad  out
    	    --, @pais out
    	    --, @npais out
    	    , @moneda_singular out
    	    , @moneda_plural  out;
    
    	   SELECT @idioma
    		   , @NOMBRE
    		   , @apellidos
    		   , @c10
    		   , @correo
    		   , @tipoidentificacion
    		   , @identificacion
    		   , @region
    		   , @direccion
    		   , @localidad
    		   , @pais
    		   , @npais
    		   , @moneda_singular
    		   , @moneda_plural;
    
    
        SELECT * FROM REGISTROSLOG;

    Salida


    Si lo prefieres con parámetros nominales

    Exec sp_ExecuteSql

    https://docs.microsoft.com/es-es/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017

    • Propuesto como respuesta eRiver1 martes, 30 de abril de 2019 18:02
    • Marcado como respuesta Pablo RubioModerator jueves, 9 de mayo de 2019 15:50
    martes, 30 de abril de 2019 5:06