【问题标题】:SqlServer sp_send_dbmail send query result from local temp tableSql Server sp_send_dbmail 从本地临时表发送查询结果
【发布时间】:2014-10-21 20:15:31
【问题描述】:

尝试使用 sp_send_dbmail 从存储过程中输出结果 (感谢 Joe Stefannel 的解决方案)。 当使用全局临时表变量 (##Summary) 时,它可以工作。 使用本地临时表变量 (#Summary) 时失败。 根据我的阅读,全局变量选项在此处不适用,因为 sproc 将由 Web 应用程序调用,因此将同时引用同一个临时表。

显然对 sp_send_dbmail 的调用不是“内部上下文”,因此局部变量失败。 有解决办法吗?

Sproc 流程: 创建表#Summary (字段...)

Select stuff into #Summary

exec msdb.dbo.sp_send_dbmail
@profile_name = 'Me',
@recipients = 'me@mysite.co.nz',
@body = 'Test from Me',
@subject = 'Automated Test Message',
@query = 'select * from #Summary ' ,
@attach_query_result_as_file = 1, 
@query_attachment_filename = 'testing.csv',
@query_result_separator=','

drop table #Summary

谢谢

【问题讨论】:

标签: sql-server


【解决方案1】:

在我自己的问题中遇到了这个问题。全局临时表将起作用。使用 ## 创建表并使用电子邮件 sql 从中查询,它将起作用。

【讨论】:

    【解决方案2】:

    临时表不起作用,因为邮件功能只是将电子邮件排队,因此该表必须可用于不同的进程和连接。你可以

    1. 创建具有时间戳和 guid 列的永久表。
    2. 重写您存储的 proc 调用,以将 #summary 记录插入到具有相同 guid 和当前时间的新表中。
    3. 将 db 邮件参数中的查询更改为从步骤 2 中硬编码到您的 guid 的新表中进行选择。
    4. 编写一个快速 SQL 作业以删除超过一小时的记录。

    【讨论】:

    • 嗨,Jason,我现在制作了永久桌子。 sproc 的上半部分写入此父子关系。下半部分检索新的 ParentId 并使用包含 ParentID 的 where 子句构建一个 Sqlstatement。此变量用作调用 sp_send_dbmail 的查询参数。您的回答包含必须使用永久表这一基本事实。
    【解决方案3】:

    我刚刚发现了一个使用 SQL sp_send_dbmail 存储过程的文件附件的绝佳解决方案。

    如果我们想将任何查询的输出作为 excel 附件发送(其中 TABLE1 可以是数据库中的临时表或永久表)

    SELECT COLUMN1, COLUMN2, COLUMN3 FROM TABLE1
    

    声明一个 VARCHAR(MAX) @VAR 变量,该变量将具有 HTML TABLE 属性 TABLE

    遍历要作为附件发送的表行,将每行列数据包装在 HTML TR TD 属性中,并将其附加到 @VAR 并在 sp_send_dbmail 的 @query 参数中打印

    @VAR = 
    TABLE
    TR 
    TD COLUMN1ROW1DATA /TD
    TD COLUMN2ROW1DATA /TD
    TD COLUMN3ROW1DATA /TD
    /TR
    /TABLE
    
    @query = 'PRINT ' + @VAR
    

    这就像一个魅力,我们还可以为这个在 excel 文件中可见的 HTML 表格添加格式。

    【讨论】:

    • 我想看一个工作示例,但我不确定 HTML 表格是否是必需的或要求的。
    • 事实上我找不到任何关于这种技术的信息。这并不完全是题外话,因为您可以查询本地表来填充@VAR。我仍然希望看到该技术的链接,因为我不知道如何让它发挥作用。 :-(
    【解决方案4】:

    您可以使用像##temp_table 这样的全局临时表。只是不要使用像#this_table 这样的本地#temp_table。 sp_send_dbmail 在不同的上下文中执行,不会知道本地临时表。

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      相关资源
      最近更新 更多