quarta-feira, 12 de fevereiro de 2020

Configurar DataBaseMail via Script


Fala galera, voltando hoje para demonstrar como configurar o DatabaseMail do SQL Server totalmente via script.

No script abaixo, siga os passos descristos e você terá o seu DatabaseMail configurado em poucos minutos:

-- Passo 1 -- Validar se o serviço está Ativo
 EXECUTE msdb.dbo.sysmail_help_status_sp
 -- Se estiver parado (STOPPED) rodar o script abaixo para iniciar o serviço

 EXEC msdb.dbo.sysmail_start_sp;

 -- Valida o status para ver se o retorno é (STARTED )

-- Passo 2 -- Criar uma conta ( Account )
 /*
  Nesse passo ( Criar uma conta ) que é definido as configurações de envio do email como:
  Servidor de e-mail e-mail de envio: @mailserver_name
  Porta de Comunicação ( Padrão do Servidor de e-mai ): @port
  habilitar SSL (criptografia durante o envio de dados): @enable_ssl
  Descrição da Conta: @description
  Nome da conta dentro do SQL: @account_name
  Nome que aparecerá como remetente do e-mail: @display_name
  E-mail de envio: @email_address
  Usuario do e-mail: @username
  Senha do e-mail: @password

 */
 -- Adicionar conta de e-mail
 execute msdb.dbo.sysmail_add_account_sp
  -- Dados fíxos
  @mailserver_name = 'smtp.gmail.com', -- endereço do servidor de envio de e-mails
  @port = 587, -- porta de comunicação
  @enable_ssl = 1, -- habilitar SSL (criptografia durante o envio de dados)
  -- Dados da sua conta
  @description = 'Teste de Envio de e-mail',
  @account_name = 'Conta Teste', -- nome da conta dentro do SQL
  @display_name = 'E-mail enviado pela Conta Teste',   -- Nome que aparecerá como remetente do e-mail
  @email_address = 'conta_teste@seudominio.com',
  @username = 'conta_teste@seudominio.com',
  @password = 'SuaSenha'

-- Passo 3 -- Criar um Profile de e-mail

 execute msdb.dbo.sysmail_add_profile_sp
  @profile_name = 'Profile Teste',
  @description = 'Profile para Teste de e-mail'

-- Passo 4 -- Vincular a Conta ao Profile
 /*
  Nesse passo vinculamos a conta com o profile

 */
 execute msdb.dbo.sysmail_add_profileaccount_sp
  @profile_name = 'Nome do Profile que cricou no Passo 3',
  @account_name = 'Nome da Conta que cricou no Passo 2',
  @sequence_number = 1


-- Passo 5 -- Enviar um e-mail de Teste

 execute msdb.dbo.sp_send_dbmail 
  @profile_name = 'Profile Teste', -- Nome do Profile definido no Passo 3
  @recipients = 'lfernandolsilva@gmail.com', -- Destinatário do e-mail
  @subject = 'Assunto - Teste Database Mail',
  @body = 'Teste nova conta de e-mail'



-- Passo 6 -- Consulta o stado das filas de envio:
-- A consulta abaixo, retorna o status dos ultimos 1000 emails enviado

 SELECT TOP 1000
  P.name   AS "Profile de Envio",
  C.name   AS "Conta de Envio",
  a.send_request_date AS DataEnvio,
  a.sent_date AS DataEntrega,
  (CASE
   WHEN a.sent_status = 0 THEN '0 - Aguardando envio'
   WHEN a.sent_status = 1 THEN '1 - Enviado'
   WHEN a.sent_status = 2 THEN '2 - Falhou'
   WHEN a.sent_status = 3 THEN '3 - Tentando novamente'
  END) AS Situacao,
  a.from_address AS Remetente,
  A.recipients AS Destinatario,
  a.subject AS Assunto,
  a.reply_to AS ResponderPara,
  a.body AS Mensagem,
  a.body_format AS Formato,
  a.importance AS Importancia,
  a.file_attachments AS Anexos,
  a.send_request_user AS Usuario,
  B.description AS Erro,
  B.log_date AS DataFalha
 FROM  msdb.dbo.sysmail_mailitems   A WITH(NOLOCK)
  JOIN msdb.dbo.sysmail_profile   P WITH(NOLOCK) ON A.PROFILE_ID = P.PROFILE_ID
  JOIN msdb.dbo.sysmail_account   C WITH(NOLOCK) ON A.sent_account_id = c.account_id
  LEFT JOIN msdb.dbo.sysmail_event_log B WITH(NOLOCK) ON A.mailitem_id = B.mailitem_id
 ORDER BY send_request_date DESC

segunda-feira, 10 de fevereiro de 2020

Funções LAG e LEAD

Ola pessoal passando hoje aqui para falar um pouco sobre as funções LAG e LEAD

Essas funções pode ser muito bem aproveitas em variados relatórios, analise de Inconsistências em consultas analiticas e muitas outras...

LAG - Acessa os dados de uma linha anterior no mesmo conjunto de resultados sem usar uma autojunção começando com SQL Server 2012 (11.x). LAG fornece acesso a uma linha a um determinado deslocamento físico que antecede a linha atual. Use essa função analítica em uma instrução SELECT para comparar valores na linha atual com valores em uma linha anterior.

LEAD - Acessa os dados de uma linha seguinte no mesmo conjunto de resultados sem o uso de uma autojunção começando pelo SQL Server 2012 (11.x). LEAD fornece acesso a uma linha a um determinado deslocamento físico que segue a linha atual. Use essa função analítica em uma instrução SELECT para comparar valores na linha atual com valores em uma linha seguinte.

Mas Luiz, explica melhor esse negocio de LAG e LEAD ai, bom vamos la galera:

No exemplo abaixo tenho duas tabelas "TB_CLIENTE" ( Cadastro de Clientes ) e "TB_CONTATO" que vai armazenar o Historico de quantas vezes o cliente  recebeu uma ligação ou que a empresa ligou para esse cliente.

Observe a imagem abaixo, que na tabela "TB_CONTATO" ha 6 registros para o cliente Luiz
Descrição das colunas:
"Ordem Contato"-- Ordem do registro em que foi contactado ( usei um ROW_NUMBER()  da coluna do ID_CLIENTE ordenando pela Data Inicio do Contato
"Nome Cliente"-- Nome do Cliente ( Tabela Cliente )
"Data Hora Inico Contato"- Coluna DT_INICIO_CONTATO que representa o Horario de Inico do Contato desse registro
"Data Hora fim Contato"- Coluna DT_FIM_CONTATO que representa o Horario  Final do Contato desse registro
-- LAG  ( Circulado em Verde na imagem abaixo )
"Data Hora Inico Contato ( Anterior )"- Coluna DT_INICIO_CONTATO porem usando a função LAG para retornar a Data Hora Inicio do Contato do registro Anterior ( Note que caso o registro "Data Hora Inico Contato" seja o primeiro contato com o cliente essa coluna vai retornar NULL )
"Data Hora fim Contato ( Anterior )"- Coluna DT_FIM_CONTATO porem usando a função LAG para retornar a Data Hora Final do Contato do registro Anterior
-- LEAD  ( Circulado em Azul na imagem abaixo )
"Data Hora Inico Contato ( Proximo )"- Coluna DT_INICIO_CONTATO porem usando a função LEAD para retornar a Data Hora Inicio do Contato do proximo registro de contato com o cliente( Note que caso esse "Data Hora Inico Contato" seja o ultimo contato com o cliente essa coluna vai retornar NULL )
"Data Hora fim Contato ( Proximo )"- Coluna DT_FIM_CONTATO porem usando a função LEAD para retornar a Data Hora Final do Contato do proximo registro de contato com o cliente



Script utilizado nessa demo:

--DROP TABLE TB_CLIENTE

CREATE TABLE TB_CLIENTE (
 ID_CLIENTE INT IDENTITY(1,1) PRIMARY KEY,
 NM_CLIENTE VARCHAR(80)
)

--DROP TABLE TB_CONTATO

CREATE TABLE TB_CONTATO (
 ID_CONTATO INT IDENTITY PRIMARY KEY,
 DT_INICIO_CONTATO DATETIME,
 DT_FIM_CONTATO DATETIME,
 ID_CLIENTE INT
)
TRUNCATE TABLE TB_CLIENTE

INSERT INTO TB_CLIENTE ( NM_CLIENTE ) VALUES ('LUIZ FERNANDO')


INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200130 10:59:59','20200130 11:03:30',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200130 14:10:00','20200130 14:14:30',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200201 09:05:03','20200201 09:06:30',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200202 13:11:03','20200202 13:17:50',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200203 10:01:11','20200203 10:04:31',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200203 19:07:31','20200203 19:10:25',1)

SET DATEFORMAT DMY

SELECT
 ROW_NUMBER() OVER(PARTITION BY CO.ID_CLIENTE ORDER BY CO.DT_INICIO_CONTATO ASC) AS "Ordem Contato",

 C.NM_CLIENTE AS "Nome Cliente",
 CO.DT_INICIO_CONTATO  AS "Data Hora Inico Contato",
 CO.DT_FIM_CONTATO   AS "Data Hora fim Contato",


 LAG(CO.DT_INICIO_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora Inico Contato ( Anterior )",
 LAG(CO.DT_FIM_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora fim Contato ( Anterior )",

 LEAD (CO.DT_INICIO_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora Inico Contato ( Proximo )",
 LEAD (CO.DT_FIM_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora fim Contato ( Proximo )"

FROM TB_CLIENTE C
JOIN TB_CONTATO CO ON C.ID_CLIENTE = CO.ID_CLIENTE






#FicaDica
Deus lhe ajuda a carregar os fardos que são pesados demais para você. Ele está com você para lhe sustentar e fortalecer. Entregue seus problemas a Deus e ele vai lhe ajudar



Migrando Blog https://luizflsilva.wordpress.com/

Curtindo cada vez mais a criar conteudo que possa levar aprendizado a amantes e profissionais da area de banco de dados, estou migrando o bl...