update tables tablas proporcionado one mantenimiento flujo está estadística estadisticas dañado all actualizar sql sql-server tsql sql-order-by sql-update

tables - update statistics sql server



Cómo actualizar y ordenar usando ms sql (5)

Como se indica en los comentarios a continuación, puede usar también la cláusula SET ROWCOUNT, pero solo para SQL Server 2014 y anteriores.

SET ROWCOUNT 10 UPDATE messages SET status = 10 WHERE status = 0 SET ROWCOUNT 0

Más información: http://msdn.microsoft.com/en-us/library/ms188774.aspx

O con una mesa temp

DECLARE @t TABLE (id INT) INSERT @t (id) SELECT TOP 10 id FROM messages WHERE status = 0 ORDER BY priority DESC UPDATE messages SET status = 10 WHERE id IN (SELECT id FROM @t)

Idealmente quiero hacer esto:

UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;

En inglés: quiero que los 10 primeros mensajes disponibles (estado = 0) provengan del DB y bloquearlos (estado = 10). Un mensaje con una prioridad más alta debe obtenerse primero.

Desafortunadamente, MS SQL no permite una cláusula order by en la actualización.

De todos modos, ¿cómo evitar esto?


Puede hacer una subconsulta en la que primero obtenga los ID de los 10 principales ordenados por prioridad y luego actualice los que están en esa sub consulta:

UPDATE messages SET status=10 WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC);


Tengo que ofrecer esto como un mejor enfoque: no siempre puedes darte el lujo de un campo de identidad:

UPDATE m SET [status]=10 FROM ( Select TOP (10) * FROM messages WHERE [status]=0 ORDER BY [priority] DESC ) m

También puede hacer que la sub consulta sea tan complicada como desee: unir varias tablas, etc.

¿Por qué es esto mejor? No se basa en la presencia de un campo de identidad (o cualquier otra columna única) en la tabla de messages . Se puede usar para actualizar las N primeras filas de cualquier tabla, incluso si esa tabla no tiene ninguna clave única.


UPDATE messages SET status=10 WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC);


WITH q AS ( SELECT TOP 10 * FROM messages WHERE status = 0 ORDER BY priority DESC ) UPDATE q SET status = 10