Procedimiento almacenado para renumerar registros

Sí, no es LINQ, pero algunos todavía trabajamos con SQL, ¿no?.


Supongamos que tenemos una tabla de tareas a realizar, agrupadas en listaHsTaskss y queremos renumerar las tareas que pertenezcan a una determinada lista de tareas en función de ciertos campos.


El nuevo orden va en el campo [Order], como es natural, y queremos ordenar por los campos Status (Desc), Urgent (Desc) y el mismo [Order].


Al final, después de buscar una solución y que varias no me funcionaran en todos los casos, he encontrado una solución para renumerar según las premisas anteriores las tareas de una determinada lista (ListId). Como no soy un experto de base de datos creo que se puede mejorar.


Este es el procedimiento almacenado, que renumera perfectamente usando la nueva función de Sql Server 2005 Row_number():


 


ALTER PROCEDURE [dbo].[spRenumberTasksByList]
    @ListId int
AS
BEGIN
    UPDATE [dbo].[HsTasks]


    SET [Order] = nu * 10
    FROM [dbo].[HsTasks] A INNER JOIN
    (SELECT ROW_NUMBER() OVER (Order by [Status] DESC, [Urgent] DESC, [Order]) AS NU, [Id], [ListId]
      FROM [dbo].[HsTasks]
    WHERE ListId=@ListId) B
      ON A.Id = B.ID
    WHERE B.ListID = @ListId
END

 


 

4 comentarios sobre “Procedimiento almacenado para renumerar registros”

  1. Me han preguntado si este procedimiento sirve también para claves únicas.
    La respuesta es que podemos calcular el orden de los registros dentro de una selección y en función de ciertas reglas de ordenación, lo que era mi problema original.
    El actualizar un determinado campo con estos valores será factible dependiendo de las características de dicho campo: no podremos actualizar un campo identidad (auto-numérico) ni un campo cuyos posibles nuevos valores incumplan alguna restricción de las ue tengan establecidas. En ni caso particular el campo [Orden] lo único que tenía que cumplir es que fuera numérico.

Responder a fernandezja Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *