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

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

Preguntas similare

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

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




Respuesta Responder a este mensaje
#2 Edwin Alfaro
23/08/2007 - 23:30 | Informe spam
Hola Alejandro

Mi plan es lograr algo similar a lo que tenia en acces:

1. Crear una consulta con parametros (Consulta1). Esta contiene el filtro de
campos que quiero procesar.
2. En base a esta consulta Crear una (Consulta2) algo asi

Select sum(MONTO) From Consulta1 Goup by Cod_Alumno

Alguna idea de la forma correcta de trabajar esto en SQL???


Gracias,

Edwin.




"Alejandro Mesa" escribió en el
mensaje news:
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

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







email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida