使用Service Broker运行调用sp_send_dbmail的存储过程,阻止自身

时间:2016-07-06 19:40:45

标签: sql-server stored-procedures service-broker sp-send-dbmail

我有一个存储过程,我目前只要用户需要我手动运行。我正在为他们开发一个界面,以便能够自己启动它。我已经使用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      |

0 个答案:

没有答案