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.