I have a table in SQL Server
that makes the control of messages to be sent and a routine in C#
, configured in a Cron, that selects the pending messages, sends and marks as sent.
What I'm implementing is the ability to configure other calls on the Cron so that this processing is done in parallel, thus processing a larger volume of records in less time.
The challenge is in assembling the SQL statement so that one call does not select the records of the other call.
I have some premises to follow:
- I can not change the table structure, nor create other tables;
- The number of calls should be flexible, and more calls on the Cron may be included on demand.
The schema of the table and the query that I have is more or less this:
DECLARE @Mensagem TABLE (
id_mensagem INT IDENTITY PRIMARY KEY,
criado_em DATETIME DEFAULT GETDATE(),
destinatário VARCHAR(250),
assunto VARCHAR(250),
mensagem VARCHAR(MAX),
enviado_em DATETIME
);
INSERT @Mensagem
(destinatário, assunto, mensagem)
VALUES
('[email protected]', 'Assnto 1 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 2 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 3 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 4 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 5 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 6 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 7 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 8 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 9 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 10 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 11 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 12 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 13 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 14 Lorem Ipsum', 'Mensagem Lorem Ipsum'),
('[email protected]', 'Assnto 15 Lorem Ipsum', 'Mensagem Lorem Ipsum');
-- Seleciona os registros não enviados
SELECT
M.id_mensagem,
M.criado_em,
M.destinatário,
M.assunto,
M.mensagem,
M.enviado_em
FROM
@Mensagem AS M
WHERE
M.enviado_em IS NULL;
-- Após o envio pela rotina C#, marca a mensagem como enviada
UPDATE @Mensagem SET enviado_em = GETDATE() WHERE id_mensagem = 1;