SQL - Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

   
Vista:

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Jazpef (5 intervenciones) el 12/02/2014 22:08:04
Tengo un Script SQL Server que lo que realiza es mandar un correo (notificación) a los destinatarios indicado, funciona y todo, este script tiene procesos almacenados que funcinan conjunto con este para que se envie el correo en formato HTML, la información se almacena en una tabla temporal y se envie sin problemas PERO MI DUDA ES:

¿Como puede poner un IF o CASE o algun otra alternativa? para que se envie el correo o no, es decir si el SELECT almacenado tiene informacion mande el correo de lo contrario no mande nada y no realize la operacion, ya intente de diversas formas integrar o poner un IF o CASE me marca errores y no me lo permite por lo que ya ando algo perdido, posiblemente sea algo facil pero ya me atore y no se como realizarlo, si pudieran orientar se los agradeceria.

Por ejemplo he intentado y no funciona:

--DECLARE @TABLAS VARCHAR (MAX)
--EXEC @TABLAS = OpenSercas..JAPF_SpSinCerrarSDB 'JAPF'
--IF @TABLAS NOT IN ('',' ',NULL)

--IF (EXEC OpenSercas..JAPF_SpSinCerrarSDB 'JAPF') NOT IN ('',' ',NULL)
--BEGIN

--DECLARE @SELECT VARCHAR (MAX)
--DECLARE @TABLAS VARCHAR (MAX)
--EXEC @TABLAS = OpenSercas..JAPF_SpSinCerrarSDB 'JAPF'
--SET @SELECT = (CASE
-- WHEN @TABLAS NOT IN (' ','',NULL) THEN (

-- Y NADA PUEDO HACER QUE FUNICIONE :S


Codigo:

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

DECLARE @profile_name VARCHAR(200)
DECLARE @recipients VARCHAR(MAX)
DECLARE @subject nVARCHAR(400)
DECLARE @mensajeCuerpo varchar(250)
SET @mensajeCuerpo ='<div style="font-size: 10.0pt; font-family: &quot;Thaoma&quot;,&quot;Arial&quot;;"><br><br>¡Buen día!<br><br>Favor de continuar con el seguimiento de las seguientes referencias: <br></div>'
SET @profile_name = 'NAAPP'
SET @recipients = 'Name.App@dominio.com'
SET @subject = 'Reportes faltantes de atención de' +' '+'Name App'+' '+'-'+' '+ (CAST(Datename(month,getdate()) as nvarchar)) +' '+
(CAST(DatePart(day,getdate()) as varchar(2))) +','+ ' '+
(CAST(DatePart(year,getdate()) as varchar(4))) +' '+ '-'+' '+
(CAST(DatePart(hour,getdate()) as varchar(2))) +':'+
(CAST(DatePart(minute,getdate()) as varchar(2)))

CREATE TABLE #TMPTABLA1 (
[#] int IDENTITY,
Referencia int,
Clasificacion varchar (50),
Fecha_Registro varchar (80),
Sistema varchar(50),
Servicio_Reportado varchar(100),
Cliente varchar(50),
Estado varchar(50),
Usuario_Registro varchar(50),
Representante varchar(50),
Grupo_Representante varchar(50),
Fuente_Contacto varchar(50),
Status_Ticket varchar(50),
Fecha_Status varchar (80),
FechaUltimaBitacora varchar (80)
)

INSERT INTO #TMPTABLA1 (Referencia, Clasificacion, Fecha_Registro, Sistema, Servicio_Reportado, Cliente, Estado, Usuario_Registro, Representante, Grupo_Representante, Fuente_Contacto, Status_Ticket, Fecha_Status, FechaUltimaBitacora)
EXEC OpenSercas..JAPF_SpSinCerrarSDB 'JAPF'

CREATE TABLE #TABLAPASOHTML (
TABLA NVARCHAR(MAX)
)
exec OpenSercas.dbo.JAPF_SpSelExportTablaHtmlSD 'tempdb.dbo.#TMPTABLA1', @mensajeCuerpo, '#'

DECLARE @body NVARCHAR(MAX)
DECLARE @head NVARCHAR(MAX)
DECLARE @bodyfinal NVARCHAR(MAX)
DECLARE @Firma varchar(max)
DECLARE @TablaHTML1 NVARCHAR(MAX)

SELECT @head = OpenSercas.dbo.JAPF_fnHeadTablaSD()
SELECT @Firma = OpenSercas.dbo.JAPF_fnFirmaJAPF(1)
SET @body ='<html>'+@head +'<body>'
SET @TablaHTML1 =''
SELECT @TablaHTML1 =@TablaHTML1 +TABLA FROM #TABLAPASOHTML
SELECT @TablaHTML1 = Replace(@TablaHTML1, '&lt;', '<')
SELECT @TablaHTML1 = Replace(@TablaHTML1, '&gt;', '>')
SET @bodyfinal ='</body></html>'
SET @body = @body + @TablaHTML1+@Firma+@bodyfinal

DROP TABLE #TABLAPASOHTML
DROP TABLE #TMPTABLA1

EXEC msdb.dbo.sp_send_dbmail
@profile_name = @profile_name
,@recipients= @recipients
,@query_no_truncate=1
,@query_result_separator=''
,@subject = @subject
,@body=@body
,@body_format='HTML'
,@query_result_width=32767;

SET NOCOUNT OFF
SET ANSI_WARNINGS ON
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Isaias (690 intervenciones) el 13/02/2014 00:11:28
Lo veo muy simple, espero que sirva:

--DECLARE @Contador INT
--SET @CONTADOR = 0

INSERT INTO #TMPTABLA1 (Referencia, Clasificacion, Fecha_Registro, Sistema, Servicio_Reportado, Cliente, Estado, Usuario_Registro, Representante, Grupo_Representante, Fuente_Contacto, Status_Ticket, Fecha_Status, FechaUltimaBitacora)
--SET @CONTADOR = @@ROWCOUNT
--IF @CONTADOR = 0
--RETURN

EXEC OpenSercas..JAPF_SpSinCerrarSDB 'JAPF'

Las líneas con --, son las que incremente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Jazpef (5 intervenciones) el 13/02/2014 01:36:58
Gracias, disculpa con el "CONTADOR" puede hacer que envio o no el correo, por ejemplo si el "EXEC OpenSercas..JAPF_SpSinCerrarSDB 'JAPF'" que es un tipo SELECT si no arroja informacion no envie el correo, de lo contrario si tiene informacion si lo envie ??.. no sabia que podia ser con el contador

dejo lo verifico y confirmo muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Jazpef (5 intervenciones) el 13/02/2014 01:46:11
Primero me marcó:
A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Posteriormentre me aparecio otro error de lo que ya me aparecian:

DECLARE @Contador INT
SET @CONTADOR = 0

INSERT INTO #TMPTABLA1 (Referencia, Clasificacion, Fecha_Registro, Sistema, Servicio_Reportado, Cliente, Estado, Usuario_Registro, Representante, Grupo_Representante, Fuente_Contacto, Status_Ticket, Fecha_Status, FechaUltimaBitacora)
SET @CONTADOR = @@ROWCOUNT
IF @CONTADOR = 0
RETURN

EXEC OpenSercas..JAPF_SpSinCerrarSDB 'JAPF'


APARECE:

Msg 156, Level 15, State 1, Line 43
Incorrect syntax near the keyword 'SET'.
Msg 156, Level 15, State 1, Line 86
Incorrect syntax near the keyword 'SET'.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Jazpef (5 intervenciones) el 13/02/2014 17:19:37
Gracias Isaias, me ayudo tu comentarios, pero estuve viendo y encontré que funcionara, pero solo una vez ya que no se elimina la tabla temporal, con el contador solo lo realiza una vez y al querer hacer de nuevo detecta la tabla ya creado no llega al DROP y no permite ejecutarlo de nuevo, lo ingrese de esta forma:

--DECLARE @Contador INT
--SET @CONTADOR = 0

INSERT INTO #TMPTABLA1 (Referencia, Clasificacion, Fecha_Registro, Sistema, Servicio_Reportado, Cliente, Estado, Usuario_Registro, Representante, Grupo_Representante, Fuente_Contacto, Status_Ticket, Fecha_Status, FechaUltimaBitacora)
EXEC OpenSercas..JAPF_SpSinCerrarSDB 'HAGA'

--SET @CONTADOR = @@ROWCOUNT
--IF @CONTADOR = 0
--RETURN

Como podría ponerlo para que elimine aun asi la tabla, lo intente de esta forma:

--SET @CONTADOR = @@ROWCOUNT
--IF @CONTADOR = 0
--DROP TABLE #TMPTABLA1
--RETURN

pero al ejecutarlo ya lo permite hacerlo mas de una ocasión si no tiene informacion el resultado, pero si si tiene ya no permite enviar el correo, solo aparece como ejecutado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Isaias (690 intervenciones) el 14/02/2014 00:38:59
Si lo estas ejecutando en el analizador de consultas, debes verificar, que si la tabla existe, hacerle un DROP

Las tablas temporales se eliminan de forma automática cuando la conexión que las creo se cierra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Jazpef (5 intervenciones) el 14/02/2014 17:31:41
Lo que deseaba hacer que es elminarlas en el mismo proceso, ya que no se pretende cerrar las conexion que las creo...

buscando encontre como solucionarlo, solo fue de cambiar de lugar:

--SET @CONTADOR = @@ROWCOUNT
--IF @CONTADOR = 0
--RETURN

Este lo puse antes del envio del correo y despues de eliminación de las tablas y funciona correctamente para ambos casos, muchas gracias!

Slds!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer condicional el envio de sp_send_dbmail sobre SELECT, Tengo codigo

Publicado por Khristian (9 intervenciones) el 13/02/2014 17:33:43
Yo tengo algo similar.

Solo que no uso procedimientos almacenados.

Tengo una vista en SQL Server que cuenta los registros que cumplen el requisito para notificarse, obviamente no salen los que no.

Las notificaciones se basan en esa vista, y solo se envian las que cumplen el requisito, y por cada vez que se necesita notificar solo saldran las nuevas que cumplen el requisito.

Solo basta una vista con una consulta escalar que cuente por ejemplo los registros (detalle) de cada registro (maestro) que deben notificarse.

En el caso mio, cada pedido tiene asignaciones a productores, entonces en la tabla de asignaciones tengo una columna que tiene un booleano que indica si fue notificado.
En la vista me sale la cuenta de asignaciones pendientes y sus ID de asignaciones, que me permiten acceder (por relacion) a todos sus datos, y asi genero un html que es adjuntado al correo, y una vez el servidor de correo responde que la entrega fue correcta, marco la columna como notificada y ya no saldrá en la vista.

Lo mio esta hecho en asp.net con sql server 2008.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar