Hola, chicos,
¡Buen día!
¿Estás bien?

En este post, mostraré un guión para realizar diferentes sorteos, como el del amigo escondido, tan común entre los brasileños en fin de año. Este script fue creado por el analista de BI, especialista en T-SQL, lucas arrioni.

El script tiene algunas comprobaciones, como validar si el número de participantes permite un sorteo aleatorio y garantiza que la persona no se dibuje a sí misma o que dos participantes dibujen a la misma persona.

Para utilizar este script, simplemente edite la lista de participantes, completando el nombre y correo electrónico de cada uno, y ejecute el script. De esta forma, la rutina generará la lista del sorteo y enviará un correo electrónico a cada participante con el nombre de su amigo secreto.

Código fuente:

/***************************************************************************************************************************/
/** 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' , 'Participante1@gmail.com', RAND()*100),
('Participante2' , 'Participante2@gmail.com', RAND()*100),
('Participante3' , 'Participante3@gmail.com', RAND()*100),
('Participante4' , 'Participante4@gmail.com', RAND()*100),
('Participante5' , 'Participante5@gmail.com', RAND()*100),
('Participante6' , 'Participante6@gmail.com', 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 = 'remetente@gmail.com' -- 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 

Ejemplo del resultado de un empate:

Actualmente, la rutina envía correos electrónicos a cada participante del sorteo, que contiene el nombre de su amigo secreto. Si no sabes cómo configurar o habilitar Database Mail XP para enviar correos electrónicos en SQL Server, mira mi publicación Cómo habilitar, enviar y monitorear correos electrónicos a través de SQL Server (sp_send_dbmail).

Ejemplo de correo electrónico enviado:
Participante1: Seu amigo secreto é: Participante2

Si prefieres enviar mensajes por texto, en lugar de correo electrónico, mira cómo enviar mensajes de texto a través de SQL Server accediendo al post Cómo utilizar la API Pushbullet para enviar mensajes de texto SMS en C#, PHP, Java o SQL Server (con CLR).

¡Eso es todo, amigos!
Espero que hayas disfrutado de este post y hasta luego.