Cómo seleccionar y actualizar las filas seleccionadas en una sola consulta sql?
-
23-12-2019 - |
Pregunta
Tengo una tabla llamada Car
Table car ( id int NOT NULL, plate int NOT NULL, sent_to_server bit NOT NULL );
Quiero seleccionar todos los Coches que no son enviados al servidor
SELECT *
FROM car
WHERE sent_to_server = 0;
Entonces que debo actualizar mi DB
UPDATE car
SET sent_to_server = 1
WHERE sent_to_server = 0;
Tengo varios subprocesos, por lo que este no funciona (múltiples hilos son la lectura y la escritura a la base de datos al mismo tiempo(estoy usando sql server))
¿Cómo puedo ejecutar 2 consultas en Una Consulta ?O es que hay una solución mejor !?
nota:estoy usando C# con petapoco de la biblioteca (si importa !)
Solución
Mientras que usted está utilizando SQL Server 2005 o más tarde, usted puede hacer uso de OUTPUT
en una sola consulta.
UPDATE Car
SET sent_to_server = 1
OUTPUT Inserted.id, Inserted.plate
WHERE sent_to_server = 0;
Esto actualizará las filas donde sent_to_server
es cero y devolver las filas modificadas.No hay necesidad para una transacción.
Otros consejos
Creo que necesitas usar la transacción. Coloque sus ambas consultas en el código inferior
BEGIN TRANSACTION select * from car where sent_to_server = 0; update car set sent_to_server = 1 where sent_to_server = 0; COMMIT TRANSACTION
Por defecto La tansaction bloqueará la tabla para leer para otra conexión, por lo que otro hilo no podrá leer el resultado hasta que la transacción no esté comprometida.
Otra idea a la respuesta de @ Tony, es para cambiar el tipo de columna de sent_to_server
a un GUID, y poner allí el número de lote procesado.
Ejemplo (Pseudocódigo):
var batch = new Guid();
update car set sent_to_server = @batch where sent_to_server is null;
select * from car where sent_to_server = @batch;