SQL Server - Reutilizar funcion que retorna tabla para crear una tabla.

   
Vista:

Reutilizar funcion que retorna tabla para crear una tabla.

Publicado por DALSOM (22 intervenciones) el 31/03/2011 05:35:24
Hola a todos, por favor, diganme si esto que quiero se puede hacer y como:

tengo una funcion que retorna una tabla con un formato por campos previamente definidos,
que al ser invocada retorna solo una fila con varios campos.

Digamos que la funcion se llama Func_Lineas(pk,fk) y que se le alimentara de los datos
de la tabla TablaPK(pk,fk,valor), con los siguientes valores :

TablaPK
Pk Fk Valor
1 1 100.00
1 2 110.50
1 3 120.80

y como resultado quiero enviarle el valor del campo pk y fk y debera retornarme
los valores de la tabla por cada fila, cada vez que se llame la funcion.

Es decir, que para cada " select pk,fk,valor from tablapk where pk = 1 and fk >= 1" me devuelva
como resultado el listado del contenido de la tabla para todos los elementos del pk = 1,
o sea 3 registros.

la funcion me retornaria una fila completa de la tabla para este ejemplo
asi : select * from Func_lineas(1,2)

que me retornara el resultado : 1 2 110.50

Entonces como hago para mandarle todos los valores filtrados de la tabla a la funcion,
y tomar estos valores para formar una nueva tabla?

De antemano gracias,

Saludos,
Dalsom.
Rep. Dominicana
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

Reutilizar funcion que retorna tabla para crear una tabla.

Publicado por Isaias (3180 intervenciones) el 31/03/2011 20:21:38
Pues no me quedo muy claro el objetivo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reutilizar funcion que retorna tabla para crear una tabla.

Publicado por Dalsom (22 intervenciones) el 31/03/2011 22:00:17
Hola Isaias,
Gracias por el interes.

Pues explicado en otras palabras.
Sabe que una funcion escalar retorna un valor unico, y que este valor, lo podemos utilizar
para construir una columna en un query a una tabla.

Pues lo que deseo es lo opuesto, construir filas a partir de una funcion tabla al consultar
una tabla y enviandole los valores de los registros como parametros, y que el resultado del
query sea un conjunto de filas.

Por el ejemplo que le puse :

TablaPK
Pk Fk Valor
1 1 100.00
1 2 101.50
1 3 105.75
2 1 50.00
2 2 75.20


y si la funcion a la puedo llamar Func_Tabla asi :

select * from Func_tabla(1,2)

me devuelve solo una fila o varias, ya que la funcion devuelve siempre una tabla :

Tabla Resultado Func_Tabla
PK FK Valor
1 2 203.00 <-- En este caso, la funcion multiplica el valor por dos, por decir que hizo algun proceso con el campo Valor.

Entonces quiesiera obtener de una forma de resultado de query o tabla, el resultado de la funcion
para todos los valores de la tabla TablaPK cuyo PK = 1, es decir 3 filas :

Pk Fk Valor
1 1 200.00 -- Resultado de Func_table(1,1)
1 2 203.00 -- Resultado de Func_table(1,2)
1 3 211.50 -- Resultado de Func_table(1,3)


como resultado del query, las 3 filas resultantes de los 3 llamados a la funcion en un solo resultado como si fuera un select comun a una tabla que devuelve 3 filas.

Ahora si, espero haberle explicado mejor?

De antemano gracias.

Saludos desde
Rep. Dominicana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Fila calculada

Publicado por DALSOM (22 intervenciones) el 01/04/2011 04:16:11
Otro nombre que podria darle a lo que quiero lograr, seria una fila calculada.
Funcionaria con el mismo concepto de la columna calculada, pero seria una fila
completa lo que se calcula.

Espero que quede mas claro aun.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

Fila calculada

Publicado por Isaias (3180 intervenciones) el 01/04/2011 20:13:33
A ver si entendi, los parametros de la funcion, son, 1 = PK a consultar y 2 = La operacion de multiplicar POR DOS VECES el valor de lo que te da tu funcion.

Esto es, si ejecutara

Func_table(1,1) -- PK = 1, multiplica el valor por 1
Func_table(20,12) -- PK = 20, multiplica el valor por 12
Func_table(25,45) -- PK = 25, multiplica el valor por 45

Y que todo el resultado te lo deje como si fuera UNA sola tabla?????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Fila calculada

Publicado por DALSOM (22 intervenciones) el 02/04/2011 03:06:27
Gracias por su interes,

Espero que esta vez la pagina no distorcione los datos.

Y que todo el resultado te lo deje como si fuera UNA sola tabla????? Si, exactamente eso para
los tres valores, del query que envia los resultados, y sin enviarlos uno a uno o secuencialmente.

Le explico de nuevo.

Esta es la tabla :

TablaPK
Pk------- Fk-------- Valor
1-------- 1 ----------100.00
1--------- 2 ----------101.50
1--------- 3 ----------105.75
2--------- 1 ----------50.00
2--------- 2---------- 75.20

Esta seria la funcion

Create function Func_table(@pk int, @fk int)
returns @FilaCalc table
(Pk int, Fk int, Valor money)
as
begin
insert into @filaCalc
select pk,fk,(valor * 2) as Valor from TablePK where pk = @pk and fk = @fk
return
end

El hecho de multiplique el valor del campo por 2, es solo para simular un valor procesado,
claro el real es algo mas complejo que este, que es solo para esbozar el concepto.

Entonces queria un query que le envie los valores a la funcion para las filas cuyo
Pk sea 1, o sea tres llamados, y retorna 3 filas,

El resultado que desearia obtener, seria algo asi :
Pk----- Fk------- Valor
1-------1-------- 200.00 -- Resultado de Func_table(1,1)
1------ 2-------- 203.00 -- Resultado de Func_table(1,2)
1------ 3 --------211.50 -- Resultado de Func_table(1,3)

Y el query que intente que devolviera este resultado seria

select r.*
from TablaPk t inner join
(select * from Func_Table(t.pk,t.fk) ) r
on t.pk = r.pk and t.fk = r.fk
where t.pk = 1

Solo que no esta funcionando, o no se puede hacer, o se puede y aun no se como.
Estoy utilizando MS Sql 2008.

Gracias por su interes.
Saludos,
Dalsom.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Tabla de filas calculadas

Publicado por DALSOM (22 intervenciones) el 07/04/2011 20:46:41
Hola a todos,

He intentado de varias formas, y no he logrado crear una tabla con todas sus filas calculadas por una funcion tipo tabla. Al parecer esto no se puede hacer.

De todas formas gracias por su interes. Si algun dia me doy cuenta que estoy equivocado,
entonces actualizare este tema.

Saludos,
Dalsom.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reutilizar funcion que retorna tabla para crear una tabla.

Publicado por Salvador Sarabia (2 intervenciones) el 19/11/2014 17:53:38
Te mando un ejemplo de invocación que te puede servir:
1
2
Select Orden.IdOrden, CamposOrden.IdEntidad, CamposOrden.IdCliente, CamposOrden.ClaveCliente, CamposOrden.FolioInterno
	From Orden Outer Apply dbo.fdu_CamposOrden(IdOrden) As CamposOrden
La función se llama fdu_CamposOrden (aunque puedes usar la que quieras y con los argumentos que quieras, aquí lo importante es el uso de Outer Apply
Espero que te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Reutilizar funcion que retorna tabla para crear una tabla.

Publicado por Maite Orero (1 intervención) el 21/04/2015 17:05:24
Hola!
He probado el ejemplo de invocación que publicó Salvador Sarabia el 19/11/2014
Me ha funcionado perfectamente
Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reutilizar funcion que retorna tabla para crear una tabla.

Publicado por Salvador Sarabia (2 intervenciones) el 21/04/2015 17:12:21
Gracias a ti por probarla, espero que te haya sido de utilidad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar