特定の条件で新しいエントリのテーブルを参照し、見つかった場合は SQL メールを呼び出すストアド プロシージャがあります。ジョブは 15 分ごとに sp を実行します。新しいエントリを電子メールで送信する場合もありますが、SQL ジョブは正常に実行されても電子メールが生成されない場合もあります。SSMS でクエリを実行し、その 15 分間の間にテーブルで新しいエントリを見つけたにもかかわらずです。時間パラメーターを調整/拡張した後に手動で手順を実行したところ、スケジュールされたジョブの実行時に最初に送信されたのではなく、実行の成功が報告された電子メールが正常に生成されました。
私は他のテーブルからの通知に同様のコードを使用しており、それらは一貫して電子メールを生成しているように見えますが、異なる基準で同じテーブルを見ている別の sp も電子メールの生成で断続的です。
GROUP BY と HAVING を使用する代わりに、すべての引数を WHERE ステートメントに移動して、コードを微調整しました。また、時間範囲をさらに 15 分 (<=31 および >=15) 後ろにずらしたり、解決策がまだない 1 つのケースで最小時間引数を削除したりしました。
問題が自分のコード、sp を実行するジョブ、SQL メール、またはクエリしているテーブル (使用している日付列は 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