Sí, no es LINQ, pero algunos todavía trabajamos con SQL, ¿no?.
Supongamos que tenemos una tabla de tareas a realizar, agrupadas en listas 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
Procedimiento almacenado para renumerar registros
Hola Luis
Te dejo un interesante enlace (para los que usamos todavia SQLSERVER je, y lo seguiremos usando)
Cómo numerar filas dinámicamente en una instrucción SELECT Transact-SQL
http://support.microsoft.com/?scid=kb%3Bes%3B186133&x=16&y=15
Ademas en SQL2000 haciamos algo parecido con la ayuda de una tabla auxiliar con solo numeros.
Saludos
__________________
Jose A. Fernandez
Has comprobado que ese procedimiento funcione con claves unicas?
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.