ストアドプロシージャを作成する理由は、SQL Serverのdbメールを使用して隔週のレポートをスタッフ(コーディネータ)に送信するようにジョブをスケジュールすることです。SQL Serverストアドプロシージャとdbmailの送信
私はそれが正しい方法で動作するように問題を抱えています。私は通常、カーソルで動作しませんが、他の選択肢を見つけることができませんでした。 ここに問題があります。私は設定基準でクエリをテストし、1つのコーディネータにのみ "if @Coord_Email = '[email protected]'というn.id = '43422546'"というレコードを送信しました。しかし、クエリは5分以上実行されていたので、私はそれをキャンセルしなければなりませんでした。
ALTER PROCEDURE [dbo].[sp_MZ_Coord_rpt_s9]
AS
BEGIN
DECLARE @Member_ID VARCHAR(20)
DECLARE Report_S9 CURSOR FOR
SELECT id
FROM name
WHERE status = 'a'
OPEN Report_S9
FETCH NEXT FROM Report_S9 INTO @member_ID
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Coord_ID Varchar(20)
DECLARE @CO_ID Varchar(20)
DECLARE @Coord_Name Varchar(50)
DECLARE @Coord_Email Varchar(50)
SELECT @CO_ID = ID
FROM Relationship
WHERE id = @Member_ID
SELECT @Coord_ID = target_id
FROM Relationship
WHERE RELATION_TYPE = 'CO'
SELECT @Coord_Name = FULL_NAME
FROM Name
WHERE ID = @Coord_ID
SELECT @Coord_Email = email
FROM Name
WHERE id = @Coord_ID
IF @Coord_Email <> ''
BEGIN
SELECT
n.id, n.CO_ID, n.FULL_NAME, a.TRANSACTION_DATE, a.UF_1, r.TARGET_ID
FROM name n
INNER JOIN activity a ON n.id = a.id
INNER JOIN Tops_Profile tp ON a.id = tp.ID
INNER JOIN Relationship r ON n.CO_ID = r.ID
WHERE
n.id = @member
AND UF_1 <> ''
AND (DATEDIFF(dd, TRANSACTION_DATE, GETDATE()) < 2)
AND r.RELATION_TYPE = 'co'
ORDER BY
TRANSACTION_DATE
EXEC msdb..sp_send_dbmail
@profile_name = 'TOPS.ADMIN',
@recipients = @Coord_Email,
[email protected]_copy_recipients = ,
@subject = 'S9 Report'
End
FETCH NEXT FROM Report_S9 INTO @member_ID
END
CLOSE Report_S9
DEALLOCAT Report_S9
End
ご協力いただきまして誠にありがとうございます。
なぜこれをトランザクションでラッピングしますか?トランザクションをロールバックするコードはなく、実行した場合でもロールバックするものはありません。また、あなたのsp_接頭辞の習慣を変更することを考慮する必要があります。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –
は前とは別のスクリプトでした。私はそれを修正しました。他に何かお勧めしますか? – Messi
ここに問題があります。あなたは "私はそれが正しい方法で働くことに問題を抱えています"と述べました。どういう意味ですか?それは「正しい方法」をしているかしていないのですか?何が間違っているのかをお手伝いしますが、何が間違っているのかを説明しなければなりません。 –