Guardar un valor temporal dentro de una FUNCTION

11/10/2011 - 08:14 por Leonardo Alonzo | Informe spam
Que tal Sres.

Lo que intento hacer es crear una FUNCTION, pasarle unos valores del
registro, efectuar unos calculos ahi y que me devuelva un valor. Hasta
aqui todo bien, pero lo que necesito es guardar ese valor para que el
siguiente registro en leer la function pueda utilizar este valor ya
calculado y asi sucesivamente. He analizado algunos puntos y no logro
dar con el resultado.
- No puedo utilizar sentencias DML en tablas y temporales dentro de
una UDF
- No puedo llamar a un Store Procedure dentro de una UDF, para que
haga el trabajo, pero esto no esta permitido, salvo que sea extendido
y esto lo complica todo
- Lo unico permitido hasta ahora es utilizar variables de tipo table y
usar DML, pero estas solo existen en el ambito de la function, asi que
cuando sale de la function ya no existe tal variable.
- He intentado hacer el mismo trabajo en un SP utilizando cursores
pero el tiempo de demora es insostenible ya que el volumen a procesar
es inmenso.

No me queda otra que recurrir a uds, a ver si alguien tiene una
solucion ó alguna idea.

Utilizo SQL SERVER 2000

Gracias.

Preguntas similare

Leer las respuestas

#6 Toni
14/10/2011 - 16:45 | Informe spam
On 14 oct, 06:56, Leonardo Alonzo wrote:
On 13 oct, 10:27, yuyul wrote:

> Buenas, no se si se puede y quizas este diciendo una barbaridad,
> pero no puedes hacer que en la propia función, al realizar el calculo
> antes de devolverlo lo guarde en una tabla temporal o no temporal, y
> así en la siguiente vez que vayas a utilizar la función esta recupere
> ese valor?

> Saludos y espero ayudarles.

Hola Yuyul, es correcto tu lógica, el problema es que dentro de una
function no puedes ejecutar sentencias DML (INSERT, UPDATE, DELETE) ya
sea a tablas fisicas ó temporales.

Saludos y gracias



Leonardo; se me ocurre que si podés modificar la función para que
devuelva el valor de una fila x de tu tabla mediante algun
identificador podrías lograrlo volviendo a llamar a la función pero
para el registro anterior.

Ejemplo:

CREATE TABLE [dbo].[tabla1]
(
[id] [int] IDENTITY
NOT NULL
, [campo1] [int] NULL
, [campo2] [int] NULL
)
ON [PRIMARY]

INSERT INTO dbo.tabla1
(campo1, campo2)
VALUES (1, 2)
INSERT INTO dbo.tabla1
(campo1, campo2)
VALUES (3, 4)
INSERT INTO dbo.tabla1
(campo1, campo2)
VALUES (5, 6)
INSERT INTO dbo.tabla1
(campo1, campo2)
VALUES (7, 8)
go

CREATE FUNCTION dbo.FuncionPrueba (@id INT)
RETURNS INT
AS
BEGIN
DECLARE @ResultVar INT

SELECT @ResultVar = campo1 + campo2
FROM dbo.tabla1
WHERE id = @id

RETURN ISNULL(@ResultVar, 0)
END
GO

SELECT id
, campo1
, campo2
, dbo.FuncionPrueba(id) AS ValorRegistro
, dbo.FuncionPrueba(id - 1) AS ValorRegistroAnterior
FROM dbo.tabla1

Sinó una alternativa a los cursores que consume menos recursos es
iterar sobre una tabla temporal a la que agregues algún identificador
correlativo y los indices necesarios.

Ejemplo:

CREATE TABLE #tabla
(
id INT IDENTITY
, miCampo1 INT
, miCampo1 INT
)
DECLARE @recordTabla INT
DECLARE @recordCountTabla INT


INSERT INTO #tabla
(miCampo1
, miCampo1
)
SELECT campo1
, campo2
FROM miTablaOriginal


SELECT @recordCountTabla = COUNT(*)
, @recordTabla = 1
FROM #tabla A

CREATE CLUSTERED INDEX I_tabla ON #tabla (id)--o los campos
que optimicen tu consulta

WHILE @recordTabla <= @recordCountTabla
BEGIN

SELECT @miCampo1 = miCampo1
, @miCampo2 = miCampo1
FROM #tabla A
WHERE id = @recordTabla

/* tu codigo */

SET @recordTabla = @recordTabla + 1
END

IF OBJECT_ID('#tabla') IS NOT NULL
BEGIN
DROP TABLE #tabla
END
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida