Error en Función

05/06/2007 - 22:36 por Pablo Rodríguez | Informe spam
Hola grupo, F1, tengo el siguiente problemita:

dentro de una función tengo el siguiente código:

IF (@@ROWCOUNT = 0)
BEGIN
DECLARE @FechaHora smalldatetime
SET @FechaHora = (SELECT GETDATE())

INSERT INTO tblSesion(IdUsuario, Inicio, Cierre, Caja)
VALUES (@IdUsuario, @FechaHora, NULL, @IdCaja)

DECLARE @IdSesion int
SET @IdSesion = @@IDENTITY

INSERT INTO @RetVal -- Aquí está el error
SELECT TOP 1 *
FROM tblSesion
WHERE Id = @IdSesion
END

Y en la línea que marqué con el comentario me da el siguiente error:

Msg 443, Level 16, State 15, Procedure fnObtenerSesionCaja, Line 20
Uso no válido de operador con efectos secundarios o dependiente del tiempo
en 'INSERT' dentro de una función.

Realmente no se de que se trata el error y no encontré info al respecto
Saludos y gracias por adelantado!

Preguntas similare

Leer las respuestas

#6 Manuel Etcheto
07/06/2007 - 20:21 | Informe spam
Pablo: la clave está en lo que te dice Miguel. Eso es para un SP, no una
función...

Una función es para devolver algo (tabla o expresión) en función de algo (lo
que sea) que se pasa como parámetros, no para ejecutar tareas.

El SP puede ejecutar todo lo que necesites y, Además, devolverte conjuntos
de datos y/o parámetros output.

Suerte
Manuel


"Pablo Rodríguez" escribió en el mensaje
news:
El problema es más o menos así: tengo una tabla de sesiones donde guardo
quien y cuando inició y cerró sesión, entonces quiero hacer lo siguiente:
si existe una sesión con el mismo IdCaja que recibo por parámetro y tiene
el campo Cierre en NULL, me devuelva esa fila, de lo contrario, necesito
que inserte una nueva fila y me la devuelva.

¿se entiende? a veces no soy bueno explicando..

______________
"Pablo Rodríguez" escribió en el mensaje
news:u%
Ahora tengo un nuevo problema, ya corregí el anterior con un vista que
devuelva fecha y hora...
pero mi nuevo problema es que no puedo obtener el @@IDENTITY dentro de
una función, por lo que lo hice en un proc. almacenado... pero ahora me
encuentro con que no puedo llamar al proc. desde la función

Puedo hacer un proc. almacenado que al final haga un select sobre una
variable del tipo TABLE???
Y si puedo, como lo uso desde VB.NET??



________________
"Manuel Etcheto" escribió en el mensaje
news:
Es correcto, "No se permiten las funciones no deterministas integradas
en el cuerpo de la funciones definidas por el usuario"
Eso está textual en la ayuda, "CREATE FUNCTION", " Determinismo de
funciones y efectos secundarios"

Un truco, si necesitas utilizar la fecha del servidor es crearte una
vista que haga
"select GETDATE() as ahora" y desde la función llamar a esta vista...

Suerte
Manuel


"Pablo Rodríguez" escribió en el mensaje
news:
Hola grupo, F1, tengo el siguiente problemita:

dentro de una función tengo el siguiente código:

IF (@@ROWCOUNT = 0)
BEGIN
DECLARE @FechaHora smalldatetime
SET @FechaHora = (SELECT GETDATE())

INSERT INTO tblSesion(IdUsuario, Inicio, Cierre, Caja)
VALUES (@IdUsuario, @FechaHora, NULL, @IdCaja)

DECLARE @IdSesion int
SET @IdSesion = @@IDENTITY

INSERT INTO @RetVal -- Aquí está el error
SELECT TOP 1 *
FROM tblSesion
WHERE Id = @IdSesion
END

Y en la línea que marqué con el comentario me da el siguiente error:

Msg 443, Level 16, State 15, Procedure fnObtenerSesionCaja, Line 20
Uso no válido de operador con efectos secundarios o dependiente del
tiempo en 'INSERT' dentro de una función.

Realmente no se de que se trata el error y no encontré info al
respecto
Saludos y gracias por adelantado!













Respuesta Responder a este mensaje
#7 Pablo Rodríguez
07/06/2007 - 20:59 | Informe spam
Gracias por la explicación, realmente no sabía la diferencia entre
procedimiento y función en SQL.
Lo voy a pasar todo a un proc. y cualquier problema posteo acá.

Saludos!

______________
"Manuel Etcheto" escribió en el mensaje
news:
Pablo: la clave está en lo que te dice Miguel. Eso es para un SP, no una
función...

Una función es para devolver algo (tabla o expresión) en función de algo
(lo que sea) que se pasa como parámetros, no para ejecutar tareas.

El SP puede ejecutar todo lo que necesites y, Además, devolverte conjuntos
de datos y/o parámetros output.

Suerte
Manuel


"Pablo Rodríguez" escribió en el mensaje
news:
El problema es más o menos así: tengo una tabla de sesiones donde guardo
quien y cuando inició y cerró sesión, entonces quiero hacer lo siguiente:
si existe una sesión con el mismo IdCaja que recibo por parámetro y tiene
el campo Cierre en NULL, me devuelva esa fila, de lo contrario, necesito
que inserte una nueva fila y me la devuelva.

¿se entiende? a veces no soy bueno explicando..

______________
"Pablo Rodríguez" escribió en el mensaje
news:u%
Ahora tengo un nuevo problema, ya corregí el anterior con un vista que
devuelva fecha y hora...
pero mi nuevo problema es que no puedo obtener el @@IDENTITY dentro de
una función, por lo que lo hice en un proc. almacenado... pero ahora me
encuentro con que no puedo llamar al proc. desde la función

Puedo hacer un proc. almacenado que al final haga un select sobre una
variable del tipo TABLE???
Y si puedo, como lo uso desde VB.NET??



________________
"Manuel Etcheto" escribió en el mensaje
news:
Es correcto, "No se permiten las funciones no deterministas integradas
en el cuerpo de la funciones definidas por el usuario"
Eso está textual en la ayuda, "CREATE FUNCTION", " Determinismo de
funciones y efectos secundarios"

Un truco, si necesitas utilizar la fecha del servidor es crearte una
vista que haga
"select GETDATE() as ahora" y desde la función llamar a esta vista...

Suerte
Manuel


"Pablo Rodríguez" escribió en el mensaje
news:
Hola grupo, F1, tengo el siguiente problemita:

dentro de una función tengo el siguiente código:

IF (@@ROWCOUNT = 0)
BEGIN
DECLARE @FechaHora smalldatetime
SET @FechaHora = (SELECT GETDATE())

INSERT INTO tblSesion(IdUsuario, Inicio, Cierre, Caja)
VALUES (@IdUsuario, @FechaHora, NULL, @IdCaja)

DECLARE @IdSesion int
SET @IdSesion = @@IDENTITY

INSERT INTO @RetVal -- Aquí está el error
SELECT TOP 1 *
FROM tblSesion
WHERE Id = @IdSesion
END

Y en la línea que marqué con el comentario me da el siguiente error:

Msg 443, Level 16, State 15, Procedure fnObtenerSesionCaja, Line 20
Uso no válido de operador con efectos secundarios o dependiente del
tiempo en 'INSERT' dentro de una función.

Realmente no se de que se trata el error y no encontré info al
respecto
Saludos y gracias por adelantado!

















Respuesta Responder a este mensaje
#8 Miguel Egea
08/06/2007 - 11:56 | Informe spam
Aquí estaremos para ayudar en lo que podamos :)

Saludos
"Pablo Rodríguez" wrote in message
news:
Gracias por la explicación, realmente no sabía la diferencia entre
procedimiento y función en SQL.
Lo voy a pasar todo a un proc. y cualquier problema posteo acá.

Saludos!

______________
"Manuel Etcheto" escribió en el mensaje
news:
Pablo: la clave está en lo que te dice Miguel. Eso es para un SP, no una
función...

Una función es para devolver algo (tabla o expresión) en función de algo
(lo que sea) que se pasa como parámetros, no para ejecutar tareas.

El SP puede ejecutar todo lo que necesites y, Además, devolverte
conjuntos de datos y/o parámetros output.

Suerte
Manuel


"Pablo Rodríguez" escribió en el mensaje
news:
El problema es más o menos así: tengo una tabla de sesiones donde guardo
quien y cuando inició y cerró sesión, entonces quiero hacer lo
siguiente: si existe una sesión con el mismo IdCaja que recibo por
parámetro y tiene el campo Cierre en NULL, me devuelva esa fila, de lo
contrario, necesito que inserte una nueva fila y me la devuelva.

¿se entiende? a veces no soy bueno explicando..

______________
"Pablo Rodríguez" escribió en el mensaje
news:u%
Ahora tengo un nuevo problema, ya corregí el anterior con un vista que
devuelva fecha y hora...
pero mi nuevo problema es que no puedo obtener el @@IDENTITY dentro de
una función, por lo que lo hice en un proc. almacenado... pero ahora me
encuentro con que no puedo llamar al proc. desde la función

Puedo hacer un proc. almacenado que al final haga un select sobre una
variable del tipo TABLE???
Y si puedo, como lo uso desde VB.NET??



________________
"Manuel Etcheto" escribió en el mensaje
news:
Es correcto, "No se permiten las funciones no deterministas integradas
en el cuerpo de la funciones definidas por el usuario"
Eso está textual en la ayuda, "CREATE FUNCTION", " Determinismo de
funciones y efectos secundarios"

Un truco, si necesitas utilizar la fecha del servidor es crearte una
vista que haga
"select GETDATE() as ahora" y desde la función llamar a esta vista...

Suerte
Manuel


"Pablo Rodríguez" escribió en el mensaje
news:
Hola grupo, F1, tengo el siguiente problemita:

dentro de una función tengo el siguiente código:

IF (@@ROWCOUNT = 0)
BEGIN
DECLARE @FechaHora smalldatetime
SET @FechaHora = (SELECT GETDATE())

INSERT INTO tblSesion(IdUsuario, Inicio, Cierre, Caja)
VALUES (@IdUsuario, @FechaHora, NULL, @IdCaja)

DECLARE @IdSesion int
SET @IdSesion = @@IDENTITY

INSERT INTO @RetVal -- Aquí está el error
SELECT TOP 1 *
FROM tblSesion
WHERE Id = @IdSesion
END

Y en la línea que marqué con el comentario me da el siguiente error:

Msg 443, Level 16, State 15, Procedure fnObtenerSesionCaja, Line 20
Uso no válido de operador con efectos secundarios o dependiente del
tiempo en 'INSERT' dentro de una función.

Realmente no se de que se trata el error y no encontré info al
respecto
Saludos y gracias por adelantado!





















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