Olá pessoal,
Bom dia!
Tudo bem com vocês ?
Neste post, vou demonstrar um script para realizar sorteios diversos, como amigo oculto, que é tão comum entre os brasileiros no final de ano. Esse script foi criado pelo analista de BI, especialista em T-SQL, Lucas Arrigoni.
O script possui algumas verificações, como validar se a quantidade de participantes permite um sorteio aleatório e ele garante que a pessoa não tire ela mesma ou que dois participantes tirem a mesma pessoa.
Para a utilização desse script, basta editar a lista dos participantes, preenchendo o nome e o e-mail de cada um, e executar o script. Desta forma, a rotina vai gerar a listagem do sorteio e enviar um e-mail para cada participante, contendo o nome do seu amigo secreto.
Código-fonte:
/***************************************************************************************************************************/
/** TABELA DE PARTICIPANTES **/
/***************************************************************************************************************************/
IF(OBJECT_ID('tempdb.dbo.#Participantes') IS NOT NULL) DROP TABLE #Participantes
CREATE TABLE #Participantes (
Id INT IDENTITY(1,1),
Nm_Participante VARCHAR(70),
Nm_Amigo_Secreto VARCHAR(70),
Ds_Mail VARCHAR(70),
Id_Rand INT
)
/***************************************************************************************************************************/
/** INSERE OS PARTICIPANTES DO AMIGO SECRETO, ATRIBUINDO UM
VALOR RANDOMICO PARA ORDENAR NO MOMENTO DA BUSCA PELO AMIGO SECRETO **/
/***************************************************************************************************************************/
INSERT INTO #Participantes (Nm_Participante, Ds_Mail, Id_Rand) VALUES
('Participante1' , '[email protected]', RAND()*100),
('Participante2' , '[email protected]', RAND()*100),
('Participante3' , '[email protected]', RAND()*100),
('Participante4' , '[email protected]', RAND()*100),
('Participante5' , '[email protected]', RAND()*100),
('Participante6' , '[email protected]', RAND()*100)
IF ((SELECT COUNT(*) FROM #Participantes) < 2)
BEGIN
RAISERROR('São necessárias ao menos 2 pessoas para participar do sorteio', 16, 1)
RETURN
END
/***************************************************************************************************************************/
/** VARIÁVEIS PARA O LOOP **/
/***************************************************************************************************************************/
DECLARE @Id SMALLINT = 1,
@Nm_Amigo_Secreto VARCHAR(70),
@Mensagem VARCHAR(100),
@Ds_Mail VARCHAR(70)
/***************************************************************************************************************************/
/** LOOP **/
/***************************************************************************************************************************/
WHILE EXISTS (SELECT TOP 1 NULL FROM #Participantes WHERE Nm_Amigo_Secreto IS NULL)
BEGIN
/***************************************************************************************************************************/
/** BUSCA A PESSOA QUE NÃO TEM AMIGO SECRETO PARA DAR CONTINUIDADE A LISTA ENCADEADA **/
/***************************************************************************************************************************/
SELECT TOP 1
@Nm_Amigo_Secreto = A.Nm_Participante
FROM
#Participantes A
WHERE
A.Id <> @Id
AND Nm_Amigo_Secreto IS NULL
AND NOT EXISTS (SELECT NULL FROM #Participantes B WHERE B.Nm_Amigo_Secreto = A.Nm_Participante)
ORDER BY
A.Id_Rand
/***************************************************************************************************************************/
/** FECHAR O CICLO DA LISTA ENCADEADA DO AMIGO SECRETO **/
/***************************************************************************************************************************/
IF(@Nm_Amigo_Secreto IS NULL)
BEGIN
SELECT TOP 1
@Nm_Amigo_Secreto = A.Nm_Participante
FROM
#Participantes A
WHERE
A.Id <> @Id
AND NOT EXISTS (SELECT NULL FROM #Participantes B WHERE B.Nm_Amigo_Secreto = A.Nm_Participante)
END
/***************************************************************************************************************************/
/** ATUALIZA O AMIGO SECRETO DO PARTICIPANTE **/
/***************************************************************************************************************************/
UPDATE A
SET A.Nm_Amigo_Secreto = @Nm_Amigo_Secreto
FROM #Participantes A
WHERE A.Id = @Id
/***************************************************************************************************************************/
/** BUSCA OS DADOS PARA ENVIAR O EMAIL **/
/***************************************************************************************************************************/
SELECT
@Ds_Mail = A.Ds_Mail,
@Mensagem = A.Nm_Participante + ': Seu amigo secreto é: ' + A.Nm_Amigo_Secreto
FROM
#Participantes A
WHERE
A.Id = @Id
/***************************************************************************************************************************/
/** ENVIA EMAIL **/
/***************************************************************************************************************************/
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SeuProfileSQLServer',
@recipients = @Ds_Mail, -- Destinatário
@subject = 'Amigo Secreto',
@body = @Mensagem,
@body_format = 'HTML',
@from_address = '[email protected]' -- Remetente
/***************************************************************************************************************************/
/** BUSCA O ID DO AMIGO SECRETO QUE FOI ATRIBUIDO AO PARTICIPANTE, PARA DAR CONTINUIDADE A LISTA ENCADEADA **/
/***************************************************************************************************************************/
SELECT TOP 1
@Id = Id
FROM
#Participantes
WHERE
Nm_Participante = @Nm_Amigo_Secreto
/***************************************************************************************************************************/
SET @Nm_Amigo_Secreto = NULL
END
Exemplo do resultado de um sorteio:

Atualmente, a rotina envia e-mails para cada participante do sorteio, contendo o nome do seu amigo secreto. Caso você não saiba como configurar ou habilitar o Database Mail XP, para realizar o envio de e-mails no SQL Server, veja o meu post Como Habilitar, Enviar e Monitorar e-mails pelo SQL Server (sp_send_dbmail).
Exemplo de e-mail enviado:
Participante1: Seu amigo secreto é: Participante2
Se você preferir enviar as mensagens por torpedo, ao invés do e-mail, veja como enviar torpedos pelo SQL Server acessando o post Como utilizar a API do Pushbullet para enviar torpedos SMS no C#, PHP, Java ou pelo SQL Server (com CLR).
É isso aí, pessoal!
Espero que tenham gostado desse post e até mais.
Comentários (0)
Carregando comentários…