Funcion que retorna una Tabla

23/08/2007 - 21:03 por Edwin Alfaro | Informe spam
Hola Amigos,

Estoy creando una funcion que me devuelva una TABLA

Pero no se como hacer que esta me devuelva el resultado de la tabla.
1. a la funcion le envio Parametros
2. En base a estos genero la cadena SQL Adecuada.

3. Ya tengo la cadena "SELECT"

4. Ahora com hago para asignar el resultado de esta cadena al nombre de la
Funcion - "ftable_SubConsultaRptRecibos"????

Estoy trabado en este punto porfavor si alguien sabe la solucion.
ayudeme.

Saludos,

Edwin. ******Codigo de la Funcion ***********
*******************
CREATE FUNCTION [dbo].[ftable_SubConsultaRptRecibos]
(
@ChkFecha bit,
@FechaIni nvarchar(12) ,
@FechaFin nvarchar(12) ,
@nVerAnulados tinyint
)
RETURNS
@TSubReporteMontos TABLE
(
[RECIBONRO] [nvarchar](10) NOT NULL,
[COD_ALUMNO] [nvarchar](8) NOT NULL,
[Nombres] [nvarchar](100) NOT NULL,
[FECREC] [datetime] NOT NULL,
[ESPECI] [nvarchar](2) NULL,
[MONTOTOTAL] [smallmoney] NOT NULL
)
AS
BEGIN
DECLARE @cSQL nvarchar(Max)
SET @cSQL = 'SELECT RecibosMov.RECIBONRO, RecibosMov.COD_ALUMNO,
Maestro.NOMBRE as nombres, FECREC, ESPECI, MONTOTOTAL '
SET @cSQL = @cSQL + 'FROM Maestro INNER JOIN RecibosMov ON
Maestro.COD_ALUMNO = RecibosMov.COD_ALUMNO '


if @ChkFecha = 0
begin
if @nVerAnulados = 1
SET @cSQL = @cSQL + 'WHERE ANULADO = 0'
if @nVerAnulados = 2
SET @cSQL = @cSQL + 'WHERE ANULADO = 1'
end
else
begin
SET @cSQL = @cSQL + 'WHERE (RecibosMov.FECREC >= '+ @FechaIni + ')'
+ ' AND (RecibosMov.FECREC <= ' + @FechaFin + ') '
if @nVerAnulados = 1
SET @cSQL = @cSQL + 'AND ANULADO = 0'
if @nVerAnulados = 2
SET @cSQL = @cSQL + 'AND ANULADO = 1'
end;


RETURN

END
GO

***************************
 

Leer las respuestas

#1 Alejandro Mesa
23/08/2007 - 21:12 | Informe spam
Hola Edwin,

Ese tipo de cosas se logran mediante el uso de sql dinamico, para lo cual
debes usar EXEC(@sql) o sp_executesql @sql y dentro de las funciones de
usuario no se puede ejecutar procedmientos almacenados, al menos que estos
sean extendidos "extended stored procedure".

Ademas, la forma en que estas armando la cadena no es bueno para SS, puesto
que la probabilidad de reusar los planes de ejecucion que estan en el cache
sera baja.

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"Edwin Alfaro" wrote:

Hola Amigos,

Estoy creando una funcion que me devuelva una TABLA

Pero no se como hacer que esta me devuelva el resultado de la tabla.
1. a la funcion le envio Parametros
2. En base a estos genero la cadena SQL Adecuada.

3. Ya tengo la cadena "SELECT"

4. Ahora com hago para asignar el resultado de esta cadena al nombre de la
Funcion - "ftable_SubConsultaRptRecibos"????

Estoy trabado en este punto porfavor si alguien sabe la solucion.
ayudeme.

Saludos,

Edwin. ******Codigo de la Funcion ***********
*******************
CREATE FUNCTION [dbo].[ftable_SubConsultaRptRecibos]
(
@ChkFecha bit,
@FechaIni nvarchar(12) ,
@FechaFin nvarchar(12) ,
@nVerAnulados tinyint
)
RETURNS
@TSubReporteMontos TABLE
(
[RECIBONRO] [nvarchar](10) NOT NULL,
[COD_ALUMNO] [nvarchar](8) NOT NULL,
[Nombres] [nvarchar](100) NOT NULL,
[FECREC] [datetime] NOT NULL,
[ESPECI] [nvarchar](2) NULL,
[MONTOTOTAL] [smallmoney] NOT NULL
)
AS
BEGIN
DECLARE @cSQL nvarchar(Max)
SET @cSQL = 'SELECT RecibosMov.RECIBONRO, RecibosMov.COD_ALUMNO,
Maestro.NOMBRE as nombres, FECREC, ESPECI, MONTOTOTAL '
SET @cSQL = @cSQL + 'FROM Maestro INNER JOIN RecibosMov ON
Maestro.COD_ALUMNO = RecibosMov.COD_ALUMNO '


if @ChkFecha = 0
begin
if @nVerAnulados = 1
SET @cSQL = @cSQL + 'WHERE ANULADO = 0'
if @nVerAnulados = 2
SET @cSQL = @cSQL + 'WHERE ANULADO = 1'
end
else
begin
SET @cSQL = @cSQL + 'WHERE (RecibosMov.FECREC >= '+ @FechaIni + ')'
+ ' AND (RecibosMov.FECREC <= ' + @FechaFin + ') '
if @nVerAnulados = 1
SET @cSQL = @cSQL + 'AND ANULADO = 0'
if @nVerAnulados = 2
SET @cSQL = @cSQL + 'AND ANULADO = 1'
end;


RETURN

END
GO

***************************




Preguntas similares