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.
Comentários (0)
Carregando comentários…