Error raro en SQL Server 2000

03/04/2006 - 21:44 por Harold Godefroy | Informe spam
Saludos, en esta ocasion les consulto porque desde hace tiempo, me viene
fallando la ejecucion de una funcion que tengo definida en SQL Server y que
se arregla de una forma un tanto extraña. La funcion en particular, devuelve
una variable tipo tabla con 2 columnas que es usada a su vez por otra
funcion que juega con los registros que devuelve esta; a continuacion les
copio la funcion:

CREATE FUNCTION cmp_ret_aux (@rango1 varchar(20), @rango2 varchar(20),
@tipo_rango Integer, @emp varchar(3))
RETURNS @id TABLE (n_mov INTEGER, n_movap INTEGER)
AS
BEGIN
/* REGISTROS AFECTADOS */
IF @tipo_rango = 1 BEGIN -- Rango Tipo Codigo
INSERT @id
SELECT c.n_mov, (SELECT P.N_MOV FROM MOV_PAG P WHERE P.N_MOVap = C.N_MOV)
AS n_movap FROM mov_cxp c
left JOIN reten_mov r ON c.n_mov = r.n_mov
WHERE c.cod_emp = @emp and ret_control BETWEEN @rango1 AND @rango2

END

IF @tipo_rango = 2 BEGIN -- Rango Tipo Fecha
INSERT @id
SELECT c.n_mov, (SELECT P.N_MOV FROM MOV_PAG P WHERE P.N_MOVap = C.N_MOV)
AS n_movap FROM mov_cxp c
left JOIN reten_mov r ON c.n_mov = r.n_mov
WHERE c.cod_emp = @emp and ret_fecha BETWEEN @rango1 AND @rango2

END
RETURN
END

El detalle esta en que cuando en algunas ocasiones (no pasa siempre ni
seguido), cuando ejecuto el query desde un programa me da el siguiente
error:

"Subquery returned more than 1 value. This is not permitted when the
subquery follows =, !=, <, <= , >, >= or when the subquery is used as an
expression."

Sin ser muy sabio diria que en efecto, la sentencia select que forma el
campo N_MOVAP me esta devolviendo mas de un valor y por eso el problema
(aunque se que no puede devolver multiples valores porque no hay registros
duplicados alli); sin embargo si ejecuto la misma funcion desde el Query
Analyzer no me devuelve un error sino el conjunto de datos correctos (mas no
asi cuando lo ejecuto desde una aplicacion cuya coneccion es por ADO) y peor
aun, cuando edito la funcion y le doy enter o doy un espacio en blanco en
cualquier parte de la funcion y le doy guardar, entonces todo se arregla y
vuelve a la normalidad y el error deja de presentarse hasta dentro de un
mes, 15 dias o mas... es variable. Una vez corregido el error editando la
funcion y salvando, puedo ejecutarla por cualquier metodo y no da errores,
¿alguien tiene idea de que esta pasando?, ¿por donde debo empezar a mirar?.
Cualquier informacion adicional necesaria, con gusto la suministrare.
Gracias de antemano.

Saludos.
T.S.U. Harold Godefroy. Caracas - Venezuela
Coordinador Nacional Portalfox Venezuela
http://www.portalfox.com/venezuela
h a r o l d g o d e f r o y @ p o r t a l f o x . c o m

"Sí, soy un criminal, mi crimen es la curiosidad.
Mi crimen es juzgar a la gente por lo que dice y
piensa, no por lo que parece. Mi crimen es que
soy más listo que tu, algo que no me puedes perdonar."
The Mentor
 

Leer las respuestas

#1 Alejandro Mesa
03/04/2006 - 22:10 | Informe spam
Harold,

Para evitar el error puedes usar "select top 1 ...". Ahora, mas importante
seria poner una restriccion en esa tabla para que no se pueda insertar mas de
un [N_MOV] por [N_MOVap]. Si la siguiente sentencia devuelve alguna fila,
entonces tienes filas duplicadas por esa columna.

SELECT N_MOVap
FROM MOV_PAG
group by N_MOVap
having count(*) > 1


AMB

"Harold Godefroy" wrote:

Saludos, en esta ocasion les consulto porque desde hace tiempo, me viene
fallando la ejecucion de una funcion que tengo definida en SQL Server y que
se arregla de una forma un tanto extraña. La funcion en particular, devuelve
una variable tipo tabla con 2 columnas que es usada a su vez por otra
funcion que juega con los registros que devuelve esta; a continuacion les
copio la funcion:

CREATE FUNCTION cmp_ret_aux (@rango1 varchar(20), @rango2 varchar(20),
@tipo_rango Integer, @emp varchar(3))
RETURNS @id TABLE (n_mov INTEGER, n_movap INTEGER)
AS
BEGIN
/* REGISTROS AFECTADOS */
IF @tipo_rango = 1 BEGIN -- Rango Tipo Codigo
INSERT @id
SELECT c.n_mov, (SELECT P.N_MOV FROM MOV_PAG P WHERE P.N_MOVap = C.N_MOV)
AS n_movap FROM mov_cxp c
left JOIN reten_mov r ON c.n_mov = r.n_mov
WHERE c.cod_emp = @emp and ret_control BETWEEN @rango1 AND @rango2

END

IF @tipo_rango = 2 BEGIN -- Rango Tipo Fecha
INSERT @id
SELECT c.n_mov, (SELECT P.N_MOV FROM MOV_PAG P WHERE P.N_MOVap = C.N_MOV)
AS n_movap FROM mov_cxp c
left JOIN reten_mov r ON c.n_mov = r.n_mov
WHERE c.cod_emp = @emp and ret_fecha BETWEEN @rango1 AND @rango2

END
RETURN
END

El detalle esta en que cuando en algunas ocasiones (no pasa siempre ni
seguido), cuando ejecuto el query desde un programa me da el siguiente
error:

"Subquery returned more than 1 value. This is not permitted when the
subquery follows =, !=, <, <= , >, >= or when the subquery is used as an
expression."

Sin ser muy sabio diria que en efecto, la sentencia select que forma el
campo N_MOVAP me esta devolviendo mas de un valor y por eso el problema
(aunque se que no puede devolver multiples valores porque no hay registros
duplicados alli); sin embargo si ejecuto la misma funcion desde el Query
Analyzer no me devuelve un error sino el conjunto de datos correctos (mas no
asi cuando lo ejecuto desde una aplicacion cuya coneccion es por ADO) y peor
aun, cuando edito la funcion y le doy enter o doy un espacio en blanco en
cualquier parte de la funcion y le doy guardar, entonces todo se arregla y
vuelve a la normalidad y el error deja de presentarse hasta dentro de un
mes, 15 dias o mas... es variable. Una vez corregido el error editando la
funcion y salvando, puedo ejecutarla por cualquier metodo y no da errores,
¿alguien tiene idea de que esta pasando?, ¿por donde debo empezar a mirar?.
Cualquier informacion adicional necesaria, con gusto la suministrare.
Gracias de antemano.

> Saludos.
T.S.U. Harold Godefroy. Caracas - Venezuela
Coordinador Nacional Portalfox Venezuela
http://www.portalfox.com/venezuela
h a r o l d g o d e f r o y @ p o r t a l f o x . c o m

"Sí, soy un criminal, mi crimen es la curiosidad.
Mi crimen es juzgar a la gente por lo que dice y
piensa, no por lo que parece. Mi crimen es que
soy más listo que tu, algo que no me puedes perdonar."
The Mentor




Preguntas similares