2016/11/24

CLAUSULA OUTPUT EN STORED PROCEDURES

 CLAUSULA OUTPUT EN STORED PROCEDURES

PROBLEMA: Alguna vez hemos regresado valores desde un procedimiento almacenado, regularmente lo utilizamos para devolver un conjunto de datos a través de la cláusula SELECT, pero sabíamos que existe la clausula OUTPUT para devolver valores también?

SOLUCION:  Sinceramente yo uso los procedimientos almacenados para devolver un conjunto de datos con mayor frecuencia que un solo valor, por lo tanto casi no uso esta cláusula pero es bueno que sepamos que existen otras opciones.

Algunas características?

  • Es posible devolver casi cualquier tipo, a excepción de TEXT, NTEXT, IMAGE, tipo de dato TABLA
  • Puedes utilizar las palabras reservadas OUT|OUTPUT

Algunos ejemplos de su funcionamiento?
USE AdventureWorks2014; 

GO

CREATE PROCEDURE dbo.ProcedimientoOutput
 @paramEntrada VARCHAR(20)
 , @paramSalidaDatetime DATETIME  OUT
 , @paramSalidaINT  INT    OUTPUT
 , @paramSalidaDECIMAL DECIMAL(5,2) OUT
 , @paramSalidaMoney  MONEY   OUTPUT
 , @paramSalidaUI  UNIQUEIDENTIFIER OUT
AS
 SET NOCOUNT ON;
 PRINT @paramEntrada; 
 SET @paramSalidaDatetime = GETDATE() 
 SET @paramSalidaINT = 1234567
 SET @paramSalidaDECIMAL = 123.45
 SET @paramSalidaMoney = 12345.678
 SET @paramSalidaUI = NEWID()
GO

--Declaramos las variables que se utilizarán para recibir los valores de salida
DECLARE @salidaDatetime DATETIME; 
DECLARE @salidaINT INT; 
DECLARE @salidaDecimal DECIMAL(5,2); 
DECLARE @salidaMoney MONEY; 
DECLARE @salidaUI UNIQUEIDENTIFIER; 

EXEC dbo.ProcedimientoOutput 'ENTRADA' , @salidaDateTime OUT, @salidaINT OUT, @salidaDecimal OUT, @salidaMoney OUT, @salidaUI OUT; 

SELECT @salidaDatetime, @salidaDatetime, @salidaINT, @salidaDecimal, @salidaMoney, @salidaUI ;

Ahora bien, si queremos devolver un tipo CURSOR también lo podemos hacer, ya que no podemos devolver un tipo de dato TABLA:
USE AdventureWorks2014; 

GO

CREATE PROCEDURE dbo.ProcedimientoOutputCursor
 @paramEntrada VARCHAR(20)
 , @paramCursor   CURSOR VARYING OUTPUT
AS
 SET NOCOUNT ON;
 PRINT @paramEntrada; 
 SET @paramCursor = CURSOR FOR
      SELECT ROW_NUMBER() OVER( ORDER BY CurrencyCode ) AS rn, CurrencyCode, Name
      FROM Sales.Currency;
    OPEN @paramCursor;
GO

DECLARE @cursor CURSOR;

EXEC dbo.ProcedimientoOutputCursor 'ENTRADA' , @cursor OUTPUT;

WHILE (@@FETCH_STATUS = 0)
BEGIN;
     FETCH NEXT FROM @cursor;
END;
CLOSE @cursor;
DEALLOCATE @cursor;
GO


Cualquier duda, ya saben como contactarme ;)

SALUDOS!
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario