Sentencia max tabla vacia

04/10/2008 - 01:38 por Ricardo Uribe Zegarra | Informe spam
Hola grupo, tengo una gran duda.

Tengo una tabla vacia, a la cual le hago una sentencia.
SELECT @Codigo = CASE WHEN MAX(CodigoArticuloCompuesto) = NULL THEN 1
ELSE MAX(CodigoArticuloCompuesto) END + 1
FROM ArticuloCompuesto

Con esto genero un codigo correlativo para mis articulos. El problema es que
no me devuelve nada.

Probando utilice estas sentencias.
SELECT CASE WHEN MAX(codigoarticulocompuesto) <> NULL THEN0 else 1 end
from articulocompuesto

SELECT CASE WHEN MAX(codigoarticulocompuesto) = NULL THEN 0 else 1 end
from articulocompuesto

lo raro es que las 2 sentencias me devuelven 1.

Si alguien me puede explicar que tipo de resultado devuelve max cuando se
usa en una
tabla vacia.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Pedro
04/10/2008 - 02:25 | Informe spam
Usa la funcion ISNULL():

Select IsNull(Max(...), 1) from ...




"Ricardo Uribe Zegarra" escribió en el mensaje
news:
Hola grupo, tengo una gran duda.

Tengo una tabla vacia, a la cual le hago una sentencia.
SELECT @Codigo = CASE WHEN MAX(CodigoArticuloCompuesto) = NULL THEN 1
ELSE MAX(CodigoArticuloCompuesto) END + 1
FROM ArticuloCompuesto

Con esto genero un codigo correlativo para mis articulos. El problema es
que
no me devuelve nada.

Probando utilice estas sentencias.
SELECT CASE WHEN MAX(codigoarticulocompuesto) <> NULL THEN0 else 1 end
from articulocompuesto

SELECT CASE WHEN MAX(codigoarticulocompuesto) = NULL THEN 0 else 1 end
from articulocompuesto

lo raro es que las 2 sentencias me devuelven 1.

Si alguien me puede explicar que tipo de resultado devuelve max cuando se
usa en una
tabla vacia.

Muchas gracias.




Respuesta Responder a este mensaje
#2 Maxi Accotto
04/10/2008 - 02:53 | Informe spam
Hola, mucho cuidado con esto para generar codigo correlativo, en tu caso se
podria dar que a dos procesos les de el mismo numero. Los select no hacen
lockeos esclusivos a menos que se lo indiques y con tu metodo estas en
problemas, a mi para estas cosas me gusta tener una tabla numeradora.
Mira este link

http://msmvps.com/blogs/maxiaccotto...tento.aspx


Saludos
Maxi Accotto
Microsoft MVP en SQLServer
SQltotalconsulting
-

"Ricardo Uribe Zegarra" escribió en el mensaje de
noticias:
Hola grupo, tengo una gran duda.

Tengo una tabla vacia, a la cual le hago una sentencia.
SELECT @Codigo = CASE WHEN MAX(CodigoArticuloCompuesto) = NULL THEN 1
ELSE MAX(CodigoArticuloCompuesto) END + 1
FROM ArticuloCompuesto

Con esto genero un codigo correlativo para mis articulos. El problema es
que
no me devuelve nada.

Probando utilice estas sentencias.
SELECT CASE WHEN MAX(codigoarticulocompuesto) <> NULL THEN0 else 1 end
from articulocompuesto

SELECT CASE WHEN MAX(codigoarticulocompuesto) = NULL THEN 0 else 1 end
from articulocompuesto

lo raro es que las 2 sentencias me devuelven 1.

Si alguien me puede explicar que tipo de resultado devuelve max cuando se
usa en una
tabla vacia.

Muchas gracias.




Respuesta Responder a este mensaje
#3 Alejandro Mesa
04/10/2008 - 03:32 | Informe spam
'Ricardo Uribe Zegarra,

Lo que pasa con este codigo es que haces una comparacion con NULL que no es
la que se usa por defecto.

MAX(CodigoArticuloCompuesto) = NULL

Por defecto tenemos el seteo de ANSI_NULLS prendido y por lo tanto se debe
usar IS [NOT] NULL, que ademas es lo recomendado.

SELECT
@Codigo = CASE
WHEN MAX(CodigoArticuloCompuesto) IS NULL THEN 1
ELSE MAX(CodigoArticuloCompuesto) END + 1
FROM ArticuloCompuesto
GO

Por otra parte, como Maxi ya indico, debes tener cuidado y manjar errores en
tu aplicacion, porque dos sesiones diferentes pueden seleccionar el mismo
valor MAX(CodigoArticuloCompuesto) y por lo tanto trataran de insertar el
mismo valor, dando paso a un error de duplicidad en caso de tener una
restriccion de clave primaria o unica por esa columna. Deberas hacer un
bloqueo de la tabla hasta que se inserte el valor y que las otras sesiones
tengan que esperar por la sesion que tiene la tabla bloqueada, o tendras que
usar otro metodo para seleccionar el proximo valor a insertar. Para bloquear
la tabla, puedes usar un "table hint" (una vez me dijeron como se dice esto
en español pero por no usarlo mucho se me ha olvidado nuevamente - sera una
sugerencia de tabla?) como es (TABLOCK, HOLDLOCK), o puedes usar otro nivel
de aislamiento de transacción para que puedas manejat menor concurrencia. Si
usas otro nivel de aislamiento de la transaccion, debes tener cuidado y hacer
pruebas, porque puedes terminar por tener deadlocks mas de lo deseado.

Yo no le he preguntado a Jesús López si por fin termino un articulo que
pensava escribir y publicar sobre este tema, deja ver si no se me olvida esta
vez.


AMB


"Ricardo Uribe Zegarra" wrote:

Hola grupo, tengo una gran duda.

Tengo una tabla vacia, a la cual le hago una sentencia.
SELECT @Codigo = CASE WHEN MAX(CodigoArticuloCompuesto) = NULL THEN 1
ELSE MAX(CodigoArticuloCompuesto) END + 1
FROM ArticuloCompuesto

Con esto genero un codigo correlativo para mis articulos. El problema es que
no me devuelve nada.

Probando utilice estas sentencias.
SELECT CASE WHEN MAX(codigoarticulocompuesto) <> NULL THEN0 else 1 end
from articulocompuesto

SELECT CASE WHEN MAX(codigoarticulocompuesto) = NULL THEN 0 else 1 end
from articulocompuesto

lo raro es que las 2 sentencias me devuelven 1.

Si alguien me puede explicar que tipo de resultado devuelve max cuando se
usa en una
tabla vacia.

Muchas gracias.





Respuesta Responder a este mensaje
#4 Ricardo Uribe Zegarra
04/10/2008 - 19:30 | Informe spam
Muchas Gracias a los 3 por sus respuestas, especialmente maxi por el link.

saludos


"Ricardo Uribe Zegarra" escribió en el mensaje
news:
Hola grupo, tengo una gran duda.

Tengo una tabla vacia, a la cual le hago una sentencia.
SELECT @Codigo = CASE WHEN MAX(CodigoArticuloCompuesto) = NULL THEN 1
ELSE MAX(CodigoArticuloCompuesto) END + 1
FROM ArticuloCompuesto

Con esto genero un codigo correlativo para mis articulos. El problema es
que
no me devuelve nada.

Probando utilice estas sentencias.
SELECT CASE WHEN MAX(codigoarticulocompuesto) <> NULL THEN0 else 1 end
from articulocompuesto

SELECT CASE WHEN MAX(codigoarticulocompuesto) = NULL THEN 0 else 1 end
from articulocompuesto

lo raro es que las 2 sentencias me devuelven 1.

Si alguien me puede explicar que tipo de resultado devuelve max cuando se
usa en una
tabla vacia.

Muchas gracias.




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