我正在尝试调用包装T-SQL的sp_send_dbmail过程的sproc。它只是创建查询,然后将其和硬编码的主题和收件人传递给Microsoft提供的sproc。当从sql management studio运行时,sproc按预期执行,我收到一封电子邮件。从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
答案 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()在幕后做什么等等。)