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