我有一个存储过程,我目前只要用户需要我手动运行。我正在为他们开发一个界面,以便能够自己启动它。我已经使用SQL Service Broker对其进行排队并对其进行排队'调用存储过程。
如果我将存储过程结束时的调用移到sp_send_dbmail,它就可以工作。否则,在保留调用的情况下,它会自动创建一个块并无限期挂起(当我手动运行时不会发生这种情况)。
当我杀死被阻止的进程时(我猜这是dbmail调用中的查询),电子邮件已发送但不包含任何结果。
发生了什么以及如何解决?
以下是存储过程如何调用dbmail的粗略概念,以及阻塞/阻塞进程看起来是什么样的,我必须弄乱它才能完成"完成":
use mydb
declare @filename char(24)
set @filename = 'Results' + convert(char(10),convert(date,getdate())) + '.csv'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'AnonMailProfile',
@recipients = 'me@myemail.com',
@query = '
select a,b,c
into #tmpTable
from
(select a,b,c
from mydb..TableA
left join mydb..TableB
on KeyA = FKeyA
union all
select a,b,c
from mydb..TableA
left join mydb..TableC
on KeyA = FKeyA
) as ct
;with cte as(
select *,rn = ROW_NUMBER() over (partition by something order by something)
from #tmpTable
)
select * from cte
',
@subject = 'Process Complete',
@attach_query_result_as_file = 1 ,
@query_attachment_filename = @filename,
@query_result_no_padding = 1,
@query_result_separator = ' ';
| SPID | Status | Login | HostName | BlkBy | DBName | Command | ProgramName | |------|------------|-------------|------------|-------|--------|-------------|-------------| | 36 | BACKGROUND | sa | . | . | master | EXECUTE | | | 66 | SUSPENDED | DS\USER | servername | 36 | master | SELECT INTO | SQLCMD |