PDA

Ver la Versión Completa : Retorno de datos procedimiento almacenado


andresenlared
20-07-2011, 00:07:27
Saludos.

Estoy migrando un procedimiento almacenado firebird a SQL server, pero no tengo claro la parte del retorno de info que puede dar un procedimiento SQL.
En firebir puedo manejar un procedimiento en un select y me da los datos que tenga en return. Como puedo hacer esto mismo en SQL server??:confused:

mightydragonlor
20-07-2011, 02:29:37
MS-SQL devuelve los datasets simplemente con un Select * From xxx, si requieres parámetros de salida, los defines como OUT, @Salida INT y le asiganas valor así: SET @Salida = 1;
eso es todo =)

andresenlared
21-07-2011, 16:40:28
Muchas gracias por tu ayuda, ahora ya atengo el cuerpo del procedimiento almacenado pero al ejecutarlo marca error para las lineas donde esta declare y otros errores mas abajo. Entendi que para usar variables internas al procedimientio van despues del AS, y las de entrada y retorno van despues de create procedure. Coloco a continuacion el codigo que tengo...porque no he podido solucionar este problemilla. Gracias.

-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE GENERAR_FOLIO
-- Add the parameters for the stored procedure here
--<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
@ID_UMAE INT,
@ID_PACIENTE INT,
@FOLIO CHAR(13) OUTPUT,
@DES_UMAE CHAR(50) OUTPUT,
@CVE_PRESUPUESTAL CHAR(13) OUTPUT

AS
declare @CONSECUTIVO int,
declare @NEWCONSECUTIVO int,
declare @LARGO int,
declare @DIFERENCIA int,
declare @COMPLETAR char(5),
declare @COD_UMAE int,
declare @ANIO char(4),
declare @DIGIANIO CHAR(2)

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
SELECT SET @CONSECUTIVO=tbl_usrporumae.consecutivo FROM tbl_usrporumae
WHERE tbl_usrporumae.id_umae=@ID_UMAE

SET @ANIO=substring(convert(char(8), getdate(),112),1,4)
SET @DIGIANIO=substring(@ANIO,3,4)

SET @NEWCONSECUTIVO=@CONSECUTIVO+1;
SET @LARGO=5;

SET @DIFERENCIA=@LARGO-LEN(STR(@NEWCONSECUTIVO,10);
SET @COMPLETAR=''

if (@DIFERENCIA=4)
SET @COMPLETAR='0000'

If (@DIFERENCIA=3)
SET @COMPLETAR='000'

if (@DIFERENCIA=2)
SET @COMPLETAR='00'

if (@DIFERENCIA=1)
SET @COMPLETAR='0'

set @FOLIO=@COD_UMAE+'-'+@DIGIANIO+'-'+@COMPLETAR+str(NEWCONSECUTIVO,10));

UPDATE tbl_usrporumae SET tbl_usrporumae.consecutivo=@NEWCONSECUTIVO
WHERE tbl_usrporumae.id_umae=@ID_UMAE;


UPDATE tblpaciente SET tblpaciente.imp_e='T',
tblpaciente.id_umae=@ID_UMAE, TBLPACIENTE.fecha_impresione=getdate() where tblpaciente.id=@id_paciente;

END
GO

mightydragonlor
21-07-2011, 16:58:44
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
-- =============================================
-- Author:
-- Create date: <Create Date,,>
-- Description:
-- =============================================
CREATE PROCEDURE GENERAR_FOLIO
-- Add the parameters for the stored procedure here
--<@Param1, sysname, @p1> int> = ,
--<@Param2, sysname, @p2> int> =
@ID_UMAE INT,
@ID_PACIENTE INT,
@FOLIO CHAR(13) OUTPUT,
@DES_UMAE CHAR(50) OUTPUT,
@CVE_PRESUPUESTAL CHAR(13) OUTPUT
AS
BEGIN
declare @CONSECUTIVO int
declare @NEWCONSECUTIVO int
declare @LARGO int
declare @DIFERENCIA int
declare @COMPLETAR char(5)
declare @COD_UMAE int
declare @ANIO char(4)
declare @DIGIANIO CHAR(2)

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
SELECT SET @CONSECUTIVO=tbl_usrporumae.consecutivo FROM tbl_usrporumae
WHERE tbl_usrporumae.id_umae=@ID_UMAE

SET @ANIO=substring(convert(char(8), getdate(),112),1,4)
SET @DIGIANIO=substring(@ANIO,3,4)

SET @NEWCONSECUTIVO=@CONSECUTIVO+1;
SET @LARGO=5;

SET @DIFERENCIA=@LARGO-LEN(STR(@NEWCONSECUTIVO,10);
SET @COMPLETAR=''

if (@DIFERENCIA=4)
SET @COMPLETAR='0000'

If (@DIFERENCIA=3)
SET @COMPLETAR='000'

if (@DIFERENCIA=2)
SET @COMPLETAR='00'

if (@DIFERENCIA=1)
SET @COMPLETAR='0'

set @FOLIO=@COD_UMAE+'-'+@DIGIANIO+'-'+@COMPLETAR+str(NEWCONSECUTIVO,10));

UPDATE tbl_usrporumae SET tbl_usrporumae.consecutivo=@NEWCONSECUTIVO
WHERE tbl_usrporumae.id_umae=@ID_UMAE;


UPDATE tblpaciente SET tblpaciente.imp_e='T',
tblpaciente.id_umae=@ID_UMAE, TBLPACIENTE.fecha_impresione=getdate() where tblpaciente.id=@id_paciente;

END

Así debería funcionar.

andresenlared
24-07-2011, 02:13:44
Saludos.

Sigo con el cuento del procedimiento almacenado...ya esta en base de datos tiene dos parametros de entrada y retorna 3 datos.

Mi pregunta va en que componente de los ADO debo usar y como usarlo, porque uso los parametros de salida para un reporte en PDF.

uso el AdoStoredproc cuando el procedimiento no retorna nada y lo hago de la siguiente manera.

Adostoresproc.ExecProc;

y funciona bien.

pero para el procedimiento que me retorna datos, no se como usar el componente, si me sirve ese mismo, o se trabaja con un ADOquery o ADOdataset, como creo la sentancia. Ya he probado varias cosas me me salen errores.

:(

andresenlared
24-07-2011, 16:34:10
Saludos.

Ya logre ejecutar el procedimiento desde un objeto Adoquery, es muy diferente a como se maneja en firebird. Para este caso uso el mismo procedimiento que esta en este hilo y para obtener los parametros de salida se hace lo siguiente.


DECLARE @RC int
DECLARE @ID_UMAE int
DECLARE @ID_PACIENTE int
DECLARE @FOLIO varchar(13)
DECLARE @DES_UMAE varchar(50)
DECLARE @CVE_PRESUPUESTAL varchar(13)

-- TODO: Establezca los valores de los parámetros aquí.

EXECUTE @RC = [IMSS].[dbo].[GENERAR_FOLIO]
10
,1
,@FOLIO OUTPUT
,@DES_UMAE OUTPUT
,@CVE_PRESUPUESTAL OUTPUT

select "FOLIO"=@FOLIO, "DES_UMAE"=@DES_UMAE, "CVE_PRESUPUESTAL"=@CVE_PRESUPUESTAL


con este codigo en la propiedad SQL del Adoquery, ya se consigue obtener los parametros de salida.

Adoquery.open.

Lito..:D