Otra de Renumerar

21/12/2007 - 21:47 por JOMIJIMO | Informe spam
Buenas noches a todos/as:

Como otras tantas veces os solicito ayuda porque estoy seguro de que
me la podreis proporcionar.

Tengo una tabla de Movimientos (200.000 registros aprox. actualmente)
con un campo denominado "NumeroDeOrden" que necesito renumerar
periodicamente comenzando desde 1 (uno).

Pero, y aqui viene el pero, esta renumeracion debe hacerse estando la
tabla ordenada por los siguientes campos:

1º por el campo FechaMvto
2º por el campo TipoMvto
3º por el campo NumeroLote

Lo he intenado con varias soluciones que he encontrado buscando en el
foro pero no consigo adaptarlas a lo que necesito.

Aunque el indice clustered que tiene la tabla no lo componen estos
campos, tambien lo cambié para probar otras de las soluciones que he
encontrado, pero no consigo que me los renumere correctamente. Aun así
el indice clustered lo he devuelto a su estado original, ya que lo
necesito para otros menesteres.

Os ruego que me echeis una mano para ver si puedo solucionar este
asunto, ya que actualmente lo estoy haciendo atraves de la aplicacion
cliente porque no he encontrado otra solucion llegando a tardar el
proceso hasta 20 minutos.

Muchas gracias por vuestra ayuda.

Links de referencia

http://groups.google.es/group/micro...&fwc=2

http://groups.google.es/group/micro...57898b455a

Preguntas similare

Leer las respuestas

#11 Jesús López
26/12/2007 - 14:23 | Informe spam
Te voy a repetir aquí la técnica mostrada por Miguel Egea, para tu caso en
particular:

CREATE INDEX IX_Orden ON Movimientos(FechaMvto, TipoMvto, NumeroLote)

DECLARE @NumeroDeOrden int
SET @NumeroDeOrden = 0
UPDATE M
SET NumeroDeOrden = @NumeroDeOrden, @NumeroDeOrden = @NumeroDeOrden + 1
FROM Movimientos M WITH (INDEX (IX_Orden)) OPTION (MAXDOP 1)


He incluido OPTION (MAXDOP 1) para deshabilitar el paralelismo y que éste
no influya negativamente.

Saludos:

Jesús López


"Jesús López" escribió en el
mensaje news:
No dices cual es la clave primaria de la tabla Movimientos ni tampoco
dices si la combinación de los campos FechaMvto, TipoMvto y NumeroLote es
única.

Así que voy a suponer que la clave primaria de la tabla Movimientos es un
autonumérico entero llamado IdMovimiento.

Una solución al problema es tener una tabla auxiliar llamada
OrdenMovimientos, donde tenemos el NumeroDeOrden, en vez de tener
NumeroDeOrden en la tabla Movimientos:

CREATE TABLE OrdenMovimientos
(
NumeroDeOrden int IDENTITY(1,1) PRIMARY KEY,
IdMovimiento int UNIQUE
)

Esta tabla OrdenMovimientos la regeneras periódicamente con ese código:

TRUNCATE TABLE OrdenMovimientos

INSERT INTO OrdenMovimientos(IdMovimiento)
SELECT IdMovimiento
FROM Movimientos
ORDER BY FechaMvto, TipoMvto, NumeroLote

Luego para sacar consultas que incluyan el NumeroDeOrden haces un JOIN
entre las tablas:

SELECT M.*, O.NumeroDeOrden
FROM Movimientos M INNER JOIN OrdenMovimientos O ON M.IdMovimiento =
O.IdMovimiento
WHERE <criterio de búsqueda>

Esta técnica no es la más eficiente posible, pero está totalmente
garantizado que va a funcionar. La técnica más eficiente sería la que
planteaba Miguel Egea en uno de los links de referencia que habías puesto.

Saludos:

Jesús López
www.solidq.com



"JOMIJIMO" escribió en el mensaje
news:
Buenas noches a todos/as:

Como otras tantas veces os solicito ayuda porque estoy seguro de que
me la podreis proporcionar.

Tengo una tabla de Movimientos (200.000 registros aprox. actualmente)
con un campo denominado "NumeroDeOrden" que necesito renumerar
periodicamente comenzando desde 1 (uno).

Pero, y aqui viene el pero, esta renumeracion debe hacerse estando la
tabla ordenada por los siguientes campos:

1º por el campo FechaMvto
2º por el campo TipoMvto
3º por el campo NumeroLote

Lo he intenado con varias soluciones que he encontrado buscando en el
foro pero no consigo adaptarlas a lo que necesito.

Aunque el indice clustered que tiene la tabla no lo componen estos
campos, tambien lo cambié para probar otras de las soluciones que he
encontrado, pero no consigo que me los renumere correctamente. Aun así
el indice clustered lo he devuelto a su estado original, ya que lo
necesito para otros menesteres.

Os ruego que me echeis una mano para ver si puedo solucionar este
asunto, ya que actualmente lo estoy haciendo atraves de la aplicacion
cliente porque no he encontrado otra solucion llegando a tardar el
proceso hasta 20 minutos.

Muchas gracias por vuestra ayuda.

Links de referencia

http://groups.google.es/group/micro...&fwc=2

http://groups.google.es/group/micro...57898b455a




Respuesta Responder a este mensaje
#12 Carlos M. Calvelo
26/12/2007 - 19:32 | Informe spam
Hola,

On 25 dec, 18:16, JOMIJIMO wrote:
Muchas Gracias a todos por responder.

Carlos, como ya comenté antes, ya había probado lo del indice
clustered. Aunque en todos los post que he leido me aconsejan usar esa
tecnica u otra parecida, como es tu caso, no se porque extraña razon
que no llego a comprender no me funciona.



Extraña razón? Por qué no das mas información sobre que es lo que
está pasando? Qué error te da el sgbd cuando haces qué? Existen por
ejemplo referencias desde otras tablas al atributo NumeroDeOrden
por lo cual no puedes borrar esa columna o no puedes actualizarla
con otros valores? Puedes poner el DDL de la tabla y todas las
resticciones implicadas?


Incluso he probado a borrar
todos los indices de la tabla y volver a crearlos comenzando por el
indice clustered, pero ni aun así me funciona.

La tecnica que me indica Maxi Accotto, lo que hace es crear una nueva
colunma en un SP con un numero correlativo, pero eso no me sirve ya
que necesito que el dato quede grabado en el campo NumeroDeOrden y
dicha tecnica no lo hace.



Pues con un
update Movimientos set NumeroDeOrden = <nueva columna>
sería suficiente a no ser que tengas un problema con referencias
o NumeroDeOrden aún tiene la propiedad identity(), o algún problema
parecido.

Es que con la poca imformación que das va a ser dificil poder
ayudarte ya que solo podemos tratar de adivinar que es lo que
está pasando.

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