Хранимая процедура вызывает SQL-почту периодически

У меня есть хранимая процедура, которая просматривает таблицу для новых записей с определенными критериями и вызывает SQL-почту, если найден. Задание выполняется sp каждые 15 минут. Иногда он отправляет новые записи по электронной почте, но иногда задание SQL выполняется успешно, но электронное письмо не генерируется - несмотря на то, что я выполняю запросы в SSMS и нахожу новые записи в таблице в течение этого 15-минутного диапазона. Я запустил процедуру вручную после настройки / расширения параметров времени, и она успешно генерирует электронное письмо, которое не было отправлено изначально при выполнении запланированного задания, но сообщило об успешном выполнении.

Я использую аналогичный код для уведомлений из других таблиц, и они, кажется, генерируют электронные письма последовательно, но другой специалист, рассматривающий ту же таблицу для различных критериев, также периодически генерирует электронные письма.

Я изменил свой код, переместив все свои аргументы в оператор WHERE вместо использования GROUP BY и HAVING для некоторых из них. Я также сместил временной диапазон, оглядываясь назад, еще на 15 минут (<=31 и>=15) или убрал аргумент минимального времени в одном случае без каких-либо разрешений.

Я не уверен, что проблема в моем коде, задании, выполняющем sp, SQL mail или таблицу, к которой я обращаюсь (столбец даты, который я использую - тип данных datetime), версия SQL, уровень исправления и т. Д. Любые идеи, где начать искать, почему он вызывает почту иногда, а не другие?

ANSI_NULLS и QUOTED_IDENTIFIER включены

BEGIN
set nocount on
if EXISTS
(select v.vst_ext_id
 from ptdata pd (nolock)
      join fndmst fnd (nolock) on pd.find_code = fnd.find_code
      join VISIT v (nolock) on pd.vst_int_id = v.vst_int_id
 where grp_code in ('BRST500')
     and category_code in (select CAT_CODE from COLUMN_LIST where CAT_CODE like 'REST%')
     and v.dschrg_ts is null
     and DATEDIFF(MINUTE,pd.entered_date,getdate()) <= 16
     and DATEDIFF(MINUTE,pd.entered_date,getdate()) >= 0  
)
begin
execute msdb.dbo.sp_send_dbmail
@profile_name = 'profile',
@query_result_header = 0,
@recipients = 'email@domain.com',
@subject = 'Charting Alert',
@body = 'New Charting for ',
@execute_query_database = 'database',
@query ='set nocount on
(select v.vst_ext_id
    + SPACE(5)
    + "Location: "
    + bd.loc_ds 
    + SPACE(5)
    + "Entered for Date:  "
    + convert(varchar(10),entered_for_date, 101) + " " + CONVERT(varchar(5),entered_for_date, 108)
    + SPACE(5)
    + "Charted: "
    + fnd.find_description        
from t_ptdata pd (nolock)
      join t_fndmst fnd (nolock) on pd.find_code = fnd.find_code
      join TPM300_PAT_VISIT v (nolock) on pd.vst_int_id = v.vst_int_id
      join TSM950_LOCATION_REF bd (nolock) on v.loc_lvl_5_id = bd.loc_int_id

where grp_code in ("BRST500")
     and category_code in (select CAT_CODE from t_COLUMN_LIST where CAT_CODE like "REST%")
     and v.dschrg_ts is null
     and DATEDIFF(MINUTE,pd.entered_date,getdate()) <= 16
     and DATEDIFF(MINUTE,pd.entered_date,getdate()) >= 0  )'

END
END
GO

Вот пример, который, кажется, последовательно генерирует электронные письма (фактически в пределах той же хранимой процедуры), когда добавляются новые записи:

--================================
--Begin Orders
--================================
BEGIN

set nocount on


if EXISTS

(select v.vst_ext_id 
from ORDER o (nolock)
     join ORDER_DETAIL od (nolock) on o.ord_int_id = od.ord_int_id
     left join ORDER_CODE oc (nolock) on od.order_code_int_id = oc.order_code_int_id
     left join VISIT v (nolock) on o.vst_int_id = v.vst_int_id
     join LOCATION_REF bd (nolock) on v.loc_lvl_5_id = bd.loc_int_id

where od.order_code_int_id in (select order_code_int_id from ORDER_CODE (nolock) where upper(order_code_desc1) like '%RESTRA%') 
      and  v.dschrg_ts is null 
      and DATEDIFF(MINUTE,o.entered_datetime_ts,getdate()) <= 16
      and DATEDIFF(MINUTE,o.entered_datetime_ts,getdate()) >= 0   
   )
begin
execute msdb.dbo.sp_send_dbmail
@profile_name = 'profile',
@query_result_header = 0,
@recipients = 'email@domain.com',
@subject = 'Order Alert',
@body = 'New Order for ',
@execute_query_database = 'database',
@query ='set nocount on
(select v.vst_ext_id
    + SPACE(5)
    + "Location: "
    + bd.loc_ds 
    + SPACE(5)
    + "Ordered for Date:  "
    + convert(varchar(10),o.start_datetime_ts, 101) + " " + CONVERT(varchar(5),o.start_datetime_ts, 108)
    + SPACE(5)
    + "Order: "
    + oc.order_code_desc1  
from ORDER o (nolock)
     join ORDER_DETAIL od (nolock) on o.ord_int_id = od.ord_int_id
     left join ORDER_CODE oc (nolock) on od.order_code_int_id = oc.order_code_int_id
     left join VISIT v (nolock) on o.vst_int_id = v.vst_int_id
     join LOCATION bd (nolock) on v.loc_lvl_5_id = bd.loc_int_id

where od.order_code_int_id in (select order_code_int_id from ORDER_CODE (nolock) where upper(order_code_desc1) like "%RESTRA%") 
      and  v.dschrg_ts is null 
      and DATEDIFF(MINUTE,o.entered_datetime_ts,getdate()) <= 16
      and DATEDIFF(MINUTE,o.entered_datetime_ts,getdate()) >= 0   
   )'
END
END
GO

Вот код из другого, который также периодически генерирует электронные письма, но использует ту же основную таблицу - без всех объединений:

Begin
set nocount on
if EXISTS
(select visit_id 
 from ptdata
 where grp_code = 'NUSC1' and find_code = 'K_TOTAL'
   and
    DATEDIFF(MINUTE,entered_date,GETDATE()) < 16
    and value > 1
)
begin
execute msdb.dbo.sp_send_dbmail
@profile_name = 'profile',
@query_result_header = 0,
@recipients = 'email@domain.com',
@subject = 'Screen Score',
@body = 'Screening Score above 1 for ',
@execute_query_database = 'database',
@query ='set nocount on
(select rtrim(visit_id) + space(5) + "Value: " + rtrim(value) 
 from ptdata
 where grp_code = "NUSC1" and find_code = "K_TOTAL"
    and
    DATEDIFF(MINUTE,entered_date,getdate()) < 16

    and value > 1
 )'
END
END
GO

0 ответов

Другие вопросы по тегам