首页 > 解决方案 > 使用 Merge-OUTPUT 函数通过 msdb.dbo.sp_send_dbmail 转储结果

问题描述

我经常msdb.dbo.sp_send_dbmail在 SQL Server 中使用该工具来生成自动报告等,但我从未真正将它用于该@query部分中的更新/删除类型语句。

有可能这样做吗?当我运行此查询时,它会给出 0 个结果,并且不会在该@query部分中执行实际的合并和删除功能。

我正在运行一个测试场景,我知道应该有结果,并且应该删除它但没有骰子。任何建议表示赞赏,因为我可能会遗漏一些东西,因为我认为这可能是订单问题。但我认为把它放在@query应该执行的范围内。查询方式如下:

DECLARE @results NVARCHAR(1000)

Select @results = N'
MERGE Table1 A
USING Table2 B
ON A.ID = B.ID and A.recorddate = B.recorddate
WHEN NOT MATCHED BY SOURCE THEN delete
OUTPUT
$action,
deleted.*;';

Begin
EXEC msdb.dbo.sp_send_dbmail 
    @profile_name = 'Test',
    @recipients= 'test@test.com',
    @query = @results,
    @from_address = 'test@test.com', 
    @subject ='Delete Row',
    @attach_query_result_as_file = 1, 
    @query_attachment_filename = 'Merge Test',
    @query_result_separator='$',
    @query_result_width =32767,
    @query_result_no_padding=1,   
    @body = 'Results',
    @body_format = 'HTML' ;  
End

查询的结果应该执行并删除不需要的行,然后输出我希望可以导出到.CSV并通过电子邮件发送给我的结果,以便我可以查看删除的内容。

编辑:明白了!只是要使用一个临时表来存储结果并将其转储到 .csv 并在最后删除

select * into #temptable from TableA where 0=1;
MERGE Table1 A
USING Table2 B
ON A.ID = B.ID and A.recorddate = B.recorddate
WHEN NOT MATCHED BY SOURCE THEN delete
OUTPUT
$action,
deleted.* INTO #temptable;
drop table #temptable

标签: sqlsql-serverfunctionmergeoutput

解决方案


推荐阅读