通过pyodbc调用msdb.sp_send_dbmail

时间:2014-12-22 19:39:06

标签: python sql tsql pyodbc

我正在尝试调用包装T-SQL的sp_send_dbmail过程的sproc。它只是创建查询,然后将其和硬编码的主题和收件人传递给Microsoft提供的sproc。当从sql management studio运行时,sp​​roc按预期执行,我收到一封电子邮件。从pyodbc,它不会发送电子邮件。我的sproc的内容看起来类似于:

declare @qry varchar(MAX)
set @qry = 'select * from table'

EXEC msdb.dbo.sp_send_dbmail    
@recipients = 'email@email.com',
@subject = 'my email',
@query = @qry

select * from table
where 1=0

我也试过切换@exclude_query_output,flag但是没有效果。我通过以下方法调用该sproc:

def execute_sproc(query, cnxn):
    cursor = cnxn.cursor();
    rows = cursor.execute(query)           
    columns = [column[0] for column in cursor.description]
    return pd.DataFrame.from_records(rows, columns=columns)

其中查询只是执行我的包装器sproc。正如我之前提到的,当从管理工作室运行时,包装器sproc工作,但是在此处调用时不会发送电子邮件。我使用相同的凭据来访问我在这两个地方的数据库。我也使用这个函数来成功调用其他sprocs,但是它们都没有包含exec语句,也没有完成许多其他确定sp_send_dbmail正在做的事情。

如果您有任何想法,请告诉我。

谢谢, Max Goldman

1 个答案:

答案 0 :(得分:0)

所以我认为这归结为对sendmail sproc,pyodbc或两者的误解。我有另一种方法来调用编辑数据库的sprocs:

def execute_commit_sproc(query, cnxn):
cursor = cnxn.cursor();
cursor.execute(query)           
cnxn.commit()

唯一的区别是前者预期结果集,而后者更改db,并使用pyodbc的提交机制来保存结果。我没有意识到sp_send_dbmail需要调用它才能发送电子邮件。我仍然不确定为什么(写入什么,pyodbc :: commit()在幕后做什么等等。)