SQL代理作业报告省略以前发送的数据

时间:2014-11-26 21:39:14

标签: sql-server jobs sql-server-2008

我发布了一个类似的问题来帮助我编写这个脚本,我发现了它的主要部分 它是一个简单的报表设置,作为SSMS中的SQL代理作业。它使用SP_Send_dbmail通过电子邮件将结果作为HTML表格发送到电子邮件正文中。我让它工作,只有在查询结果的情况下才会发送报告。

我希望它能够在上面执行此操作,省略上一份报告中发送的任何行。
这有可能吗?

这就是我的脚本:

if exists(select o.ord_billto, o.ord_refnum , o.ord_hdrnumber, o.mov_number, o.ord_status,  o.ord_cmdvalue, o.ord_startdate
from orderheader o
where ord_billto in ('a','b','c','d')
and DATEDIFF(minute  , o.ord_datetaken, GETDATE())<=7
and ord_cmdvalue >= 250000
and ord_status in ('avl','pln','std','cmp')
)
begin
    declare @tableHTML NVARCHAR(MAX);

    SET @tableHTML=
    N'<h1>Test Report</h1>'+
    N'<table border=1>'+
    N'<tr><th>Bill To</th>'+
    N'<th>Reference number</th>'+
    N'<th>Order #</th>'+
    N'<th>Move #</th>'+
    N'<th>Order Status</th>'+
    N'<th>Value</th>'+
    N'<th>Ship date</th>'+
    N'<th>Delivery Date</th>'+
cast(( select td=o.ord_billto, '',
    td=o.ord_refnum, '',
    td=o.ord_hdrnumber, '',
    td=o.mov_number, '',
    td=o.ord_status, '',
    td=convert(decimal(10, 2), o.ord_cmdvalue), '',
    td=convert(varchar, o.ord_startdate, 101), '',
    td=convert(varchar, o.ord_completiondate, 101), ''
    from orderheader o
where ord_billto in ('a','b','c','d')
and DATEDIFF(minute , o.ord_datetaken, GETDATE())<=7
and ord_cmdvalue >= 250000
and ord_status in ('avl','pln','std','cmp')
    for XML path('tr'), type
    ) as NVARCHAR(MAX) ) +
    N'</table>' ;

    execute msdb.dbo.sp_send_dbmail
    @recipients='e-mail@domain.com',
    @subject='Test Report',
    @body=@tableHTML,
    @body_format='HTML',
    @attach_query_result_as_file='false',
    @query_attachment_filename='EDI.csv',
    @query_result_separator='',
    @query_result_no_padding='FALSE'
end

3 个答案:

答案 0 :(得分:0)

我刚看了一下我们现有的一个类似的脚本,它在脚本的底部添加了这部分代码;事实证明,我们的订单表上有15个额外的列,用于&#34; flags&#34;

&#13;
&#13;
update orderheader  set ord_extrainfo2=1
where ord_billto in ('A','B','C','D')
and DATEDIFF(MINUTE  , ord_datetaken, GETDATE())<=7
and ord_cmdvalue >= 250000
and ord_status in ('avl','pln','std','cmp')



update orderheader
set ord_extrainfo2=NULL
where ord_billto in ('A','B','C','D')
and DATEDIFF(MINUTE  , ord_datetaken, GETDATE())<=7
and ord_cmdvalue <= 250000
and ord_status in ('avl','pln','std','cmp')
and ord_extrainfo2<>NULL
&#13;
&#13;
&#13; 我会尝试将其添加到我的脚本底部,并在获得一些结果时进行更新。

感谢您的提示!

答案 1 :(得分:0)

我刚才意识到为什么我不能使用IF(选择[...])&gt; 0 ...

如果我想在脚本中包含多列,我将如何使用该逻辑?基于此的示例在select中只有一个COUNT函数,并且所有行都在HTML Table部分中声明。有什么想法吗?

答案 2 :(得分:0)

我在上面的问题中想到了我可以简单地为我的IF语句添加一个虚拟列,所以我使用了count(o.ord_hdrnumber)。

脚本的更新部分正在运行,但是当将“flag”重置为null时,我得到一个错误,指出无法将varchar值'NULL'转换为int。 ord_extrainfo2列是varchar(30)数据类型...

我使用相同的逻辑获得了另一个报告请求,因此我想一劳永逸地解决这个问题:S