1
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, which selects pending messages, sends and marks as sent.
What I’m implementing is the ability to set up other calls in Cron so that this processing is done in parallel, thus processing a larger volume of records in less time.
The challenge is in mounting the SQL statement so that one call does not select the records of the other call.
I have some premises to follow:
- I cannot change the table structure or create other tables;
- The number of calls must be flexible and more calls can be included in Cron as per demand.
The table schema and the query 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;