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

#1 Richard García
11/10/2011 - 15:27 | Informe spam
On 11 oct, 02:14, Leonardo Alonzo wrote:
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.



Hola Leonardo, por lo visto a contemplado muchas posibilidades.

Lo único que se me ocurre es que declare un nuevo parámetro en la
función y dentro de un SP llamar la función con un valor inicial de 0
o NULL para el nuevo parámetro en la primera llamada de la función. Lo
siguiente es hacer que la función retorne el valor que necesita
reutilizar y en el SP que llama la función tomar este valor retornado
y comenzar a mandarlo en la función con el nuevo parámetro previamente
declarado.

Debe modificar la función para que cuando reciba el nuevo parámetro en
0 o NULL solo consulte y retorne el valor a reutilizar, y si el nuevo
parámetro tiene un valor válido debe cambiar la lógica para que
trabaje con este.

Espero haberme hecho entender y espero que le sirva de algo esta idea.

Cualquier cosa me informa.
Respuesta Responder a este mensaje
#2 Leonardo Alonzo
11/10/2011 - 18:58 | Informe spam
On 11 oct, 15:27, Richard García
wrote:
On 11 oct, 02:14, Leonardo Alonzo wrote:









> 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.

Hola Leonardo, por lo visto a contemplado muchas posibilidades.

Lo único que se me ocurre es que declare un nuevo parámetro en la
función y dentro de un SP llamar la función con un valor inicial de 0
o NULL para el nuevo parámetro en la primera llamada de la función. Lo
siguiente es hacer que la función retorne el valor que necesita
reutilizar y en el SP que llama la función tomar este valor retornado
y comenzar a mandarlo en la función con el nuevo parámetro previamente
declarado.

Debe modificar la función para que cuando reciba el nuevo parámetro en
0 o NULL solo consulte y retorne el valor a reutilizar, y si el nuevo
parámetro tiene un valor válido debe cambiar la lógica para que
trabaje con este.

Espero haberme hecho entender y espero que le sirva de algo esta idea.

Cualquier cosa me informa.




Hola que tal. Gracias por responder. Efectivamente tu propuesta lo
intente, cree un SP, volqué la data a un cursor y comencé a recorrer
uno a uno y claro ahi si logro el resultado, el problema es la
lentitud de este proceso ya que la tabla tiene mas de 5 millones de
información. Es por ello que intento hacer lo mismo con el sgte. TSQL.

SELECT codart,Dbo.Fn_CalculaCPU(codart,fecha,tmov,cant,preu) As cpuart
FROM MyTabla WHERE

La FUNCTION Fn_CalculaCPU para el primer registro funciona ok, pero
para el 2do registro necesito el valor anterior obligatoriamente, la
formula lo requiere asi.
He intentado utilizar propiedades extendidas de forma temporal, pero
en una function tampoco puedo ejectuar un EXEC
sp_updateextendedproperty ...por un momento pense haber encontrado la
luz, pero otra vez rebote...

Ante estas situaciones tan sencillas, a veces pienso como es que un
motor tan poderoso como SQL SERVER no pueda administrar variables
globales creadas por el usuario. Eso seria grandioso y ampliaria mucho
el uso de las function y sp.

Gracias por sus sugerencias.
Respuesta Responder a este mensaje
#3 Richard García
12/10/2011 - 14:58 | Informe spam
On 11 oct, 12:58, Leonardo Alonzo wrote:
On 11 oct, 15:27, Richard García
wrote:









> On 11 oct, 02:14, Leonardo Alonzo wrote:

> > 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.

> Hola Leonardo, por lo visto a contemplado muchas posibilidades.

> Lo único que se me ocurre es que declare un nuevo parámetro en la
> función y dentro de un SP llamar la función con un valor inicial de 0
> o NULL para el nuevo parámetro en la primera llamada de la función. Lo
> siguiente es hacer que la función retorne el valor que necesita
> reutilizar y en el SP que llama la función tomar este valor retornado
> y comenzar a mandarlo en la función con el nuevo parámetro previamente
> declarado.

> Debe modificar la función para que cuando reciba el nuevo parámetro en
> 0 o NULL solo consulte y retorne el valor a reutilizar, y si el nuevo
> parámetro tiene un valor válido debe cambiar la lógica para que
> trabaje con este.

> Espero haberme hecho entender y espero que le sirva de algo esta idea.

> Cualquier cosa me informa.

Hola que tal. Gracias por responder. Efectivamente tu propuesta lo
intente, cree un SP, volqué la data a un cursor y comencé  a recorrer
uno a uno y claro ahi si logro el resultado, el problema es la
lentitud de este proceso ya que la tabla tiene mas de 5 millones de
información. Es por ello que intento hacer lo mismo con el sgte. TSQL.

SELECT codart,Dbo.Fn_CalculaCPU(codart,fecha,tmov,cant,preu) As cpuart
FROM MyTabla WHERE

La FUNCTION Fn_CalculaCPU para el primer registro funciona ok, pero
para el 2do registro necesito el valor anterior obligatoriamente, la
formula lo requiere asi.
He intentado utilizar propiedades extendidas de forma temporal, pero
en una function tampoco puedo ejectuar un EXEC
sp_updateextendedproperty ...por un momento pense haber encontrado la
luz, pero otra vez rebote...

Ante estas situaciones tan sencillas, a veces pienso como es que un
motor tan poderoso como SQL SERVER no pueda administrar variables
globales creadas por el usuario. Eso seria grandioso y ampliaria mucho
el uso de las function y sp.

Gracias por sus sugerencias.



Hola de nuevo Leonardo,

lamento que no le sirviera la sugerencia. Yo también he tenido
problemas con el uso de variables globales y es muy fustrante saber
que SQL tiene esas falencias.

Como última opción que se me ocurre para su problema es que trabaje
con un tope de datos. Procesar topes de 3000 registros por ejemplo.

Es claro que esa opción es también algo demorada y le costará tiempo y
procesamiento a SQL Server, pero es posible que le tome menos tiempo
procesar topes de 3000 registros que procesar 5 millones de una sola
vez.

Intente para ver cómo le va y qué resultados tiene el ir aumentando el
tope.

Espero le sirva de algo esta opción, porque ya en medidas extremas lo
que se me ocurre es realizar un particionamiento de la tabla. Lo que
no se es si es permitido en SQL 2000.

Suerte.
Respuesta Responder a este mensaje
#4 yuyul
13/10/2011 - 10:27 | Informe spam
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.
Respuesta Responder a este mensaje
#5 Leonardo Alonzo
14/10/2011 - 12:56 | Informe spam
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
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida