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 !)

¿Fue útil?

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.

SQL Violí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;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top