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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
/***************************************************************************************************************************/ /** 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 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', /***************************************************************************************************************************/ /** 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).
And that's it, folks!
Espero que tenham gostado desse post e até mais.