Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Курсор с выбором E-Mail  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Ребят, выручайте ни разу не писал курсоры, нужно что бы отправлялось сразу несколько писем, а сейчас только одному.

select @CopyRecipients=F.mail
FROM #temp T
INNER JOIN [IMS].[dbo].[ADUsersFull] F
on T.[Initiator] = F.ActorID
- тут у меня получается много емайлов, но отправляется только одному



  declare curMail cursor for
  
  select @CopyRecipients=F.mail
  FROM #temp T, [IMS].[dbo].[ADUsersFull] F
  WHERE T.[Initiator] = F.ActorID
   
  open curMail
  fetch from curMail into @CopyRecipients
 
 while @@fetch_status = 0
  begin
  
  
select * from #temp
where hours > 0
order by name,creativeName

drop TABLE #Date
drop TABLE #temp


select @HeadText = 'Подтверждение загрузки '

 select @BodyText = 'Вам необходимо подтвердить загрузку за прошлую неделю' + ' ' + '«c'+' '+ @start + ' '+ 'по' + ' ' + @finish +'»'
 
exec @Error = msdb.dbo.sp_send_dbmail @Recipients = @CopyRecipients, @copy_recipients = @CopyRecipients, @Subject = @HeadText, @Body =@BodyText, @Body_format = 'HTML' 


      fetch next from curMail into @CopyRecipients
  end
  close curMail
  deallocate curMail


Код честно сказать даже не компилируется, "variable assignment is not allowed in a cursor declaration."
28 июн 16, 10:23    [19343765]     Ответить | Цитировать Сообщить модератору
 Re: Курсор с выбором E-Mail  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Ошибку исправил, а вот правильность написания и работы под вопросом :)
28 июн 16, 10:32    [19343798]     Ответить | Цитировать Сообщить модератору
 Re: Курсор с выбором E-Mail  [new]
xenix
Guest
declare @CopyRecipients varchar(100);
declare @HeadText varchar(100);
declare @BodyText varchar(200);
set @CopyRecipients='';
set @HeadText='';
set @BodyText='';
declare curMail cursor for
  
  select F.mail
  FROM #temp T, [IMS].[dbo].[ADUsersFull] F
  WHERE T.[Initiator] = F.ActorID
  and  hours > 0
open curMail;
fetch next from curMail into @CopyRecipients;
while @@fetch_status=0
 begin
  select @HeadText = 'Подтверждение загрузки '

  select @BodyText = 'Вам необходимо подтвердить загрузку за прошлую неделю' + ' ' + '«c'+' '+ @start + ' '+ 'по' + ' ' + @finish +'»'
 
   exec @Error = msdb.dbo.sp_send_dbmail @Recipients = @CopyRecipients, @copy_recipients = @CopyRecipients, @Subject =      @HeadText, @Body =@BodyText, @Body_format = 'HTML' 


      fetch next from curMail into @CopyRecipients
 end
close curMail;
deallocate curMail;



   
28 июн 16, 10:37    [19343824]     Ответить | Цитировать Сообщить модератору
 Re: Курсор с выбором E-Mail  [new]
Pabl0
Member

Откуда:
Сообщений: 265
А можно как нибудь в select вывести то что получилось в итоге? А то видимо в курсоре select не работает, а хотелось бы проверить.
28 июн 16, 10:44    [19343856]     Ответить | Цитировать Сообщить модератору
 Re: Курсор с выбором E-Mail  [new]
Pabl0
Member

Откуда:
Сообщений: 265
в SELECT @CopyRecipients вывело NULL
28 июн 16, 10:46    [19343875]     Ответить | Цитировать Сообщить модератору
 Re: Курсор с выбором E-Mail  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Это если всю Job - ку смотреть.

 declare   @start as varchar(10), @finish as varchar(10),  @startDay int, @finishDay int, @startPeriod int, @FinishPeriod int, @period INT
  
    declare @MailText varchar(255),@BodyText varchar(5000),@HeadText varchar(1000),@Error int,@Code varchar(15),
			@Name varchar(255),@Recipient varchar(255),@ActorName varchar(255),
			@CopyRecipients varchar(255),@FName varchar(500),@Description varchar(500), @Subject varchar(255)


SELECT Period
INTO #Date
FROM [IMS_TEST].[dbo].[PlanPeriods]
WHERE TypeID = 2 AND (GETDATE() - 1 BETWEEN [Start] AND [Finish])


SELECT @start = (select (CASE WHEN len(cast(day([Start]) as varchar(2)))=1 then '0' else '' end)+ cast(day(Start) as varchar(2))+'.' 
+(case when len(cast(MONTH(Start) as varchar(2)))=1 then '0' else '' end)+ cast(MONTH(Start) as varchar(2))
FROM [IMS_TEST].[dbo].[PlanPeriods]
WHERE TypeID = 2 AND (GETDATE() - 1 BETWEEN [Start] AND [Finish]))

SELECT @finish = (select (CASE WHEN len(cast(day([Finish]) as varchar(2)))=1 then '0' else '' end)+ cast(day([Finish]) as varchar(2))+'.' 
+(case when len(cast(MONTH([Finish]) as varchar(2)))=1 then '0' else '' end)+ cast(MONTH([Finish]) as varchar(2))
FROM [IMS_TEST].[dbo].[PlanPeriods]
WHERE TypeID = 2 AND (GETDATE() - 1 BETWEEN [Start] AND [Finish]))


select ccp.actorID,ccp.CreativeID,Period,a.Name, cc.Name as CreativeName, cc.[Initiator], a1.Name as initiatorName,sum(isnull(Mn,0) + isnull(Tu,0) + isnull(We,0) + isnull(Th,0) + isnull(Fr,0) + isnull(St,0) + isnull(Sn,0)) as Hours
into #temp 
from CrmCreative cc
	inner JOIN CrmCreativePeriod ccp on cc.ID = ccp.CreativeID
	--inner join CrmCreativeWorkgroups ccw on ccw.ActorID = ccp.ActorID and ccw.CreativeID = ccp.CreativeID
	left join CreativeConfirmedProjectPeriod ccpp on ccpp.ActorID = ccp.ActorID and ccpp.PeriodID = ccp.Period AND ccpp.CreativeID = cc.ID
	inner join actors a on a.Actor = ccp.ActorID
	inner join actors a1 on a1.Actor = cc.Initiator
where ccp.Period in (SELECT * FROM #Date) 
AND agency IN (0,2) AND ccpp.CreativeID NOT IN (169)
group by ccp.actorID,ccp.CreativeID,Period,a.Name, cc.Name , cc.Initiator, a1.Name, cc.[Initiator]
UNION ALL
select ccp.actorID,ccp.CreativeID,Period,a.Name, cc.Name as CreativeName, cc.[Initiator], a1.Name as initiatorName,sum(isnull(Mn,0) + isnull(Tu,0) + isnull(We,0) + isnull(Th,0) + isnull(Fr,0) + isnull(St,0) + isnull(Sn,0)) as Hours
from CrmCreative cc
	inner JOIN CrmCreativePeriod ccp on cc.ID = ccp.CreativeID
	--inner join CrmCreativeWorkgroups ccw on ccw.ActorID = ccp.ActorID and ccw.CreativeID = ccp.CreativeID
	left join CreativeConfirmedProjectPeriod ccpp on ccpp.ActorID = ccp.ActorID and ccpp.PeriodID = ccp.Period  AND ccpp.CreativeID = cc.ID
	inner join actors a on a.Actor = ccp.ActorID
	inner join ims.dbo.actors a1 on a1.Actor = cc.Initiator
where ccp.Period in (SELECT * FROM #Date)
AND agency IN (1)
group by ccp.actorID,ccp.CreativeID,Period,a.Name, cc.Name , cc.Initiator, a1.Name, cc.[Initiator]

  declare curMail cursor for
  
  select F.mail
  FROM #temp T, [IMS].[dbo].[ADUsersFull] F
  WHERE T.[Initiator] = F.ActorID
  and  hours > 0
open curMail;
fetch next from curMail into @CopyRecipients;
while @@fetch_status=0
 begin
  select @HeadText = 'Подтверждение загрузки '

  select @BodyText = 'Вам необходимо подтвердить загрузку за прошлую неделю' + ' ' + '«c'+' '+ @start + ' '+ 'по' + ' ' + @finish +'»'
 
   exec @Error = msdb.dbo.sp_send_dbmail @Recipients = @CopyRecipients, @copy_recipients = @CopyRecipients, @Subject =      @HeadText, @Body =@BodyText, @Body_format = 'HTML' 


      fetch next from curMail into @CopyRecipients
 END
close curMail;
deallocate curMail;
  
  drop TABLE #Date
  drop TABLE #temp
28 июн 16, 10:49    [19343898]     Ответить | Цитировать Сообщить модератору
 Re: Курсор с выбором E-Mail  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Pabl0, как-то так:

declare @CopyRecipients varchar(max)

select @CopyRecipients = isnull(@CopyRecipients, '', @CopyRecipients + ';') + F.mail
FROM #temp T
INNER JOIN [IMS].[dbo].[ADUsersFull] F on T.[Initiator] = F.ActorID

exec @Error = msdb.dbo.sp_send_dbmail @Recipients = @CopyRecipients, @Subject = @HeadText, @Body =@BodyText, @Body_format = 'HTML'
28 июн 16, 13:02    [19344796]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить