2014-02-25 2 views
0

인트라넷 웹 응용 프로그램을 통해 증명 양식을 작성하지 않은 경우 회사의 직원에게 전자 메일 미리 알림을 보내는 기능이 제공됩니다.SQL Server 2008 R2에서 전자 메일 보내기

야간 데이터베이스 작업 (SQL Server 2008 R2)에서 호출되는 저장 프로 시저를 작성하려고 생각했습니다. proc은 직원 전자 메일 주소 값을 선택하고 커서를 통해 루프를 반복하므로 msdb.dbo.sp_send_dbmail을 사용하여 전자 메일이 발견되면 각 전자 메일이 전송됩니다.

내가 가진 걱정은 대기업을위한 것이며 수만 개의 전자 메일이 야간에 나올 수 있다는 것입니다. 이러한 대량의 전자 메일을 보낼 때 성능 문제를 완화 할 수있는 방법이 있습니까? 아니면 수만 레벨에서 우려 할 필요가 없습니까?

+0

이 문제는 메일 서버의 문제가 될 수 있으며이 질문은 서버 오류나 데이터베이스 관리자에게 더 유리할 것이라고 생각합니다. –

답변

2

귀하의 절차 내에서 임시 테이블/테이블 변수를 생성하고 전자 메일을 보내려는 전자 메일을 채울 수 있습니다.

테이블에 모든 전자 메일이 있으면이 전자 메일 주소를 ;과 연결하여 변수에 저장하고 해당 변수를 매개 변수로 msdb.dbo.sp_send_dbmail proc의 @recipients 매개 변수로 전달할 수 있습니다. 이 같은

뭔가 ...

당신이 테이블 변수는 프로 시저 내부의 이메일

DECLARE @Emails TABLE(Email NVARCHAR(1000)) 
INSERT INTO @Emails VALUES 
('[email protected]'),('[email protected]'),('[email protected]') --<-- Three emails you want to send email 

병합을 이메일이라고 채운 말

DECLARE @Email_List NVARCHAR(MAX); --<-- Variable to store emails List 

SELECT @Email_List = STUFF((SELECT ';' + Email [text()] 
          FROM @Emails 
          FOR XML PATH(''),TYPE) 
          .value('.','NVARCHAR(MAX)'),1,1, '')     
FROM @Emails e 

-- Test SELECT @Email_List 
-- RESULT: [email protected];[email protected];[email protected] 

지금 @recipients이 변수를 전달 매개 변수

EXECUTE msdb.dbo.sp_send_dbmail @profile_name = 'ProfileName' 
           , @recipients = @Email_List 
           , @subject  = 'Some_Subject' 
+0

이것은 매우 흥미로운 아이디어입니다. @recipients (및 @blind_copy_recipients)는 varchar (최대)이므로 많은 수의 주소를 보유 할 수 있습니다. 즉, 당신이 다른 메모,이 정말 서버 사람들을위한 질문이라고 말했다? – Yoav

+0

@Yoav 글쎄, 당신은 여기 해결책을 가지고 있는데, 나는 왜 당신이 "서버 사람들"을 필요로하는지에 대한 어떤 이유를 보지 못한다. :) –

+0

당신이 맞다. 그것은 훌륭한 해결책이고 그런 것으로 표시했다. – Yoav

관련 문제