【问题标题】:calling msdb.sp_send_dbmail via pyodbc通过 pyodbc 调用 msdb.sp_send_dbmail
【发布时间】:2014-12-22 19:39:05
【问题描述】:

我正在尝试调用包装 T-SQL 的 sp_send_dbmail 过程的存储过程。它只是创建查询,然后将该查询以及硬编码的主题和收件人传递给 Microsoft 提供的存储过程。从 sql management studio 运行时,存储过程按预期执行,我收到一封电子邮件。从 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, 标志,但没有效果。我正在通过以下方法调用该存储过程:

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 在从管理工作室运行时可以工作,但在此处调用时不会发送电子邮件。我在两个地方都使用相同的凭据来访问我的数据库。我还使用此函数成功调用了其他存储过程,但它们都没有包含 exec 语句,它们也没有完成我确定 sp_send_dbmail 正在做的许多其他事情。

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

谢谢, 马克斯·高盛

【问题讨论】:

  • 只是一个想法 - 确保 sql server 配置文件设置正确。将 @profile='myprofile' 添加到您对 sp_send_dbmail 的调用中。

标签: python sql tsql pyodbc


【解决方案1】:

所以我认为这归结为对 sendmail sproc、pyodbc 或两者的误解。我有另一种方法可以调用编辑数据库的存储过程:

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

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

【讨论】:

  • Max,我在整个互联网上都找到了这篇文章的代码,但没有人愿意为你提供信用。为这个解决方案添加功劳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多