Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Funcion regresa nulo

Estas en el tema de Funcion regresa nulo en el foro de SQL Server en Foros del Web. HOLA QUE TAL, UN GUSTO ANDAR POR AQUI DESPUES DE AÑOS, ESA GENTE DE SEGURIDAD NO DA SALIDA NI SIQUIERA A ESTOS FOROS. NI HABLAR, ...
  #1 (permalink)  
Antiguo 30/09/2011, 17:51
 
Fecha de Ingreso: mayo-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 2
Pregunta Funcion regresa nulo

HOLA QUE TAL, UN GUSTO ANDAR POR AQUI DESPUES DE AÑOS, ESA GENTE DE SEGURIDAD NO DA SALIDA NI SIQUIERA A ESTOS FOROS. NI HABLAR, AL MENOS RECORDE MI USUARIO Y CONTRASEÑA.

REALISE UNA FUNCION EN SQL, CON EL SIGUEINTE CUERPO

CREATE FUNCTION "DBO".NOMBRE_FUNCION (@pPARAMETRO1 VARCHAR, @pPARAMETRO2 DATETIME)
RETURNS NUMERIC
AS
BEGIN
DECLARE @VARIABLE NUMERIC (20)

SELECT @VARIABLE = CAMPO
FROM TABLA1, TABLA2,
WHERE
AND (CAMPOA) IN (
SELECT MAX(CAMPOA)
FROM TABLA A1
WHERE CAMPOA1 = CAMPOA
)
RETURN @VARIABLE
END

LA FUNCION YA ESTA CREADA. EL SELECT DE LA FUNCION ME REGRESA LO ESPERADO. PERO CUANDO METO A UN SELECT DICHA FUNCION COMO SI FUERA UN CAMPO ME REGRESA "NULL".
HE QUERIDO PROBAR LA FUNCION, PERO NO ES COMO EN ORACLE "CON SELECT * FROM DUAL".

COMO PROBAR UN FUNCION EN SQL O PORQUE REGRESA NULO LA FUNCION, SI SU SELECT INTERNODE ESTA SI TRAE DATOS?

SALUDOS Y ES BUENO ESTAR DE VUELTA
  #2 (permalink)  
Antiguo 30/09/2011, 18:38
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Funcion regresa nulo

Primero, debes utlizar JOIN en lugar de unir tus tablas en el WHERE, segundo, NUNCA utilices el IN, a menoso que te amenacen de muerte, cambialo por el EXISTS o NOT EXISTS, tercero, debes utilizar ALIAS para tus tablas, si vas a hacer referencia en el segundo select de los campos del primer select.
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 05/10/2011, 17:35
 
Fecha de Ingreso: mayo-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Funcion regresa nulo

Que tal IISLAS, ya hice lo que me sujeriste, y si el tiempo mejora y por lo que e leido tiene un meror performance en JOIN que el WHERE; pero porque el EXISTS en lugar del IN, en que es mejor?.

A por certo al querer crear la funcion me manda un error por un DISTINCT(Campo) que tengo en el SELECT. En Oracle no hacia esto, realmente sin son distintos.
  #4 (permalink)  
Antiguo 05/10/2011, 18:23
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Funcion regresa nulo

porque el EXISTS en lugar del IN:

R = Porque es de un mejor (mucho mejor) tiempo de respuesta

No veo ningun DISTINCT
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 05/10/2011, 18:49
 
Fecha de Ingreso: mayo-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Funcion regresa nulo

OK. muchas gracias, es bueno saberlo y mas cuando tus tablas son de miles de registros. gracias viejo.
PONGO MI CODIGO, por lo del DISTINCT
---------------------------------------------------------------------------------------------

CREATE FUNCTION DBO.M4FN_MAX_PLAZA (@pID_EMPLEADO VARCHAR, @pFEC_PAGO DATETIME)
RETURNS NUMERIC
AS
BEGIN
DECLARE @vMAX_PLAZA NUMERIC (10)

SELECT @vMAX_PLAZA = DISTINCT (RL.ID_PLAZA)
FROM M4T_ACUMULADO_RL RL

INNER JOIN M4T_ACUMULADO_RL1 RL1
ON RL.ID_SOCIEDAD = RL1.ID_SOCIEDAD
AND RL.ID_EMPLEADO = RL1.ID_EMPLEADO
AND RL.FEC_ALTA_EMPLEADO = RL1.FEC_ALTA_EMPLEADO
AND RL.FEC_IMPUTACION = RL1.FEC_IMPUTACION
AND RL.FEC_PAGO = RL1.FEC_PAGO

INNER JOIN M4T_LISTADO_NOM LN
ON RL.ID_SOCIEDAD = LN.ID_SOCIEDAD
AND RL.ID_EMPLEADO = LN.ID_EMPLEADO
AND RL.FEC_ALTA_EMPLEADO = LN.FEC_ALTA_EMPLEADO
AND RL.FEC_IMPUTACION = LN.FEC_IMPUTACION
AND RL.FEC_PAGO = LN.FEC_PAGO

WHERE (RL.FEC_IMPUTACION) = (SELECT MAX(RLA.FEC_IMPUTACION)
FROM M4_ACUMULADO_RL RLA
WHERE RLA.ID_EMPLEADO = RL.ID_EMPLEADO
AND RLA.FEC_PAGO = RL.FEC_PAGO)

AND RL.ID_EMPLEADO = @pID_EMPLEADO
AND RL.FEC_PAGO = @pFEC_PAGO

RETURN @vMAX_PLAZA
END

---------------------------------------------------------------------------------------------
si yo quiero crear la consulta de este modo, me manda error precisamente por el DISTINCT que esta en el SELECT, si se lo quito me deja crearla sin problemas, pero entonces la funcion asi estaria mal ya que sin el DISTINCT regresa varios valores.
  #6 (permalink)  
Antiguo 06/10/2011, 07:58
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Funcion regresa nulo

Código SQL:
Ver original
  1. DECLARE @variable INT
  2. SELECT DISTINCT id FROM #temp
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 06/10/2011, 12:36
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Funcion regresa nulo

Código SQL:
Ver original
  1. CREATE FUNCTION DBO.M4FN_MAX_PLAZA (@pID_EMPLEADO VARCHAR, @pFEC_PAGO DATETIME)
  2. RETURNS NUMERIC
  3. AS
  4. BEGIN
  5. DECLARE @vMAX_PLAZA NUMERIC (10)
  6. DECLARE @MYVAR INT    -- No se de que tipo deba ser esta variable
  7.  
  8. -- Obtengo el valor maximo
  9. SELECT @MYVAR = MAX(RLA.FEC_IMPUTACION)
  10. FROM M4_ACUMULADO_RL RLA INNER JOIN M4_ACUMULADO_RL RL1
  11. ON RLA.ID_EMPLEADO = RL1.ID_EMPLEADO
  12. AND RLA.FEC_PAGO = RL1.FEC_PAGO
  13.  
  14. RETURN(
  15. SELECT DISTINCT (RL.ID_PLAZA)
  16. FROM M4T_ACUMULADO_RL RL
  17.  
  18. INNER JOIN M4T_ACUMULADO_RL1 RL1
  19. ON RL.ID_SOCIEDAD = RL1.ID_SOCIEDAD
  20. AND RL.ID_EMPLEADO = RL1.ID_EMPLEADO
  21. AND RL.FEC_ALTA_EMPLEADO = RL1.FEC_ALTA_EMPLEADO
  22. AND RL.FEC_IMPUTACION = RL1.FEC_IMPUTACION
  23. AND RL.FEC_PAGO = RL1.FEC_PAGO
  24.  
  25. INNER JOIN M4T_LISTADO_NOM LN
  26. ON RL.ID_SOCIEDAD = LN.ID_SOCIEDAD
  27. AND RL.ID_EMPLEADO = LN.ID_EMPLEADO
  28. AND RL.FEC_ALTA_EMPLEADO = LN.FEC_ALTA_EMPLEADO
  29. AND RL.FEC_IMPUTACION = LN.FEC_IMPUTACION
  30. AND RL.FEC_PAGO = LN.FEC_PAGO
  31.  
  32. WHERE (RL.FEC_IMPUTACION) = @MYVAR
  33. AND RL.ID_EMPLEADO = @pID_EMPLEADO
  34. AND RL.FEC_PAGO = @pFEC_PAGO)
  35.  
  36. END
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 12/10/2011, 19:00
 
Fecha de Ingreso: mayo-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Funcion regresa nulo

Hola hola, que tal, pues sigo aqui con lo de mi funcion. la ultima vez no me aceptaba el distinct en el SELECT y con la ayuda de IISLAS quedo eso, si embargo la funcion a la hora de meterla en mi SELECT como si fuera un campo me trae NULO. La funcion luce bien, ya verifique los tipos de datos provenientes de la tablas, la longitud de los mismos y nada, lo raro es que pruebo el cuerpo de la funcion por fuera y si me trae el dato correcto.

Si alguien me hecha la mano se lo agradeceria.

meto mi codigo ya jalando

CREATE FUNCTION DBO.M4FN_MAX_PLAZA (@pID_EMPLEADO VARCHAR)
RETURNS NUMERIC(22,0)
AS
BEGIN

RETURN (
SELECT DISTINCT (RL.ID_PLAZA)
FROM M4T_ACUMULADO_RL RL

INNER JOIN M4T_ACUMULADO_RL1 RL1
ON RL.ID_SOCIEDAD = RL1.ID_SOCIEDAD
AND RL.ID_EMPLEADO = RL1.ID_EMPLEADO
AND RL.FEC_ALTA_EMPLEADO = RL1.FEC_ALTA_EMPLEADO
AND RL.FEC_IMPUTACION = RL1.FEC_IMPUTACION
AND RL.FEC_PAGO = RL1.FEC_PAGO

INNER JOIN M4T_LISTADO_NOM LN
ON RL.ID_SOCIEDAD = LN.ID_SOCIEDAD
AND RL.ID_EMPLEADO = LN.ID_EMPLEADO
AND RL.FEC_ALTA_EMPLEADO = LN.FEC_ALTA_EMPLEADO
AND RL.FEC_IMPUTACION = LN.FEC_IMPUTACION
AND RL.FEC_PAGO = LN.FEC_PAGO

WHERE RL.FEC_PAGO =(
SELECT MAX(RLA.FEC_IMPUTACION)
FROM M4T_ACUMULADO_RL RLA
INNER JOIN M4T_ACUMULADO_RL1 RL1A
ON RLA.ID_SOCIEDAD = RL1A.ID_SOCIEDAD
AND RLA.ID_EMPLEADO = RL1A.ID_EMPLEADO
AND RLA.FEC_ALTA_EMPLEADO = RL1A.FEC_ALTA_EMPLEADO
AND RLA.FEC_IMPUTACION = RL1A.FEC_IMPUTACION
AND RLA.FEC_PAGO = RL1A.FEC_PAGO

INNER JOIN M4T_LISTADO_NOM LNA
ON RLA.ID_SOCIEDAD = LNA.ID_SOCIEDAD
AND RLA.ID_EMPLEADO = LNA.ID_EMPLEADO
AND RLA.FEC_ALTA_EMPLEADO = LNA.FEC_ALTA_EMPLEADO
AND RLA.FEC_IMPUTACION = LNA.FEC_IMPUTACION
AND RLA.FEC_PAGO = LNA.FEC_PAGO

WHERE RLA.ID_EMPLEADO = @pID_EMPLEADO
)
AND RL.ID_EMPLEADO = @pID_EMPLEADO)

END

Por cierto como hacen para meter ese cuadro con codigo, como el de IISLAS, hasta barra de desplazamiento tiene, esta chido.
  #9 (permalink)  
Antiguo 13/10/2011, 18:39
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Funcion regresa nulo

"como hacen para meter ese cuadro con codigo", seleccionas tu codigo completo, vas al como de "Highlight" y escoges la opcion SQL.

Es en ALGUNOS REGISTROS o en todos, donde te da NULL

Si es en TODOS, tus registros no cumplen con las reglas de la funcion, si no, entonces solo aquellos donde te da NULL
__________________
MCTS Isaias Islas

Etiquetas: funcion, nulo, select, sql, tabla, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:51.