Sql 正在尝试了解如何使用sp_send_dbmail发送多个文件附件

Sql 正在尝试了解如何使用sp_send_dbmail发送多个文件附件,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,MSSQL 2008 也许我只是找错地方了。 以下是场景: 我们将文件存储在varbinary(max)列中。 我想选择这些作为单独的文件,以及存储在附近的文件名作为单独的文件附件 DECLARE @cmd varchar(1000) DECLARE @sql varchar(1000) SET @cmd = 'sqlcmd -S localhost -d MYDB -E -o "C:\MyPath\SellVsBasePriceDetail.csv" -Q "s

MSSQL 2008

也许我只是找错地方了。 以下是场景:

我们将文件存储在varbinary(max)列中。 我想选择这些作为单独的文件,以及存储在附近的文件名作为单独的文件附件

DECLARE @cmd varchar(1000)
DECLARE @sql varchar(1000)

SET @cmd = 'sqlcmd -S localhost -d MYDB -E -o "C:\MyPath\SellVsBasePriceDetail.csv" -Q "select * from MYDB.dbo.vwSellVsBasePrice order by LocationDescription,Class" -W -w 999 -s","'
EXEC master..xp_cmdshell @cmd

SET @m_sql = 'select * from vwSellVsBasePriceSummary order by LocationDescription,Class'

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'FOO DBMAIL',
@recipients = 'foo@foo.org', 
@subject = @m_subject,
@body = @m_msg,
@body_format ='HTML',
@query = @sql,
@execute_query_database = 'MYDB',
@attach_query_result_as_file=1,
@query_attachment_filename = 'SellVsBasePriceSummary.csv',
@query_result_separator = ',',
@query_result_header = 1,
@query_result_width = 32767,
@query_result_no_padding = 1,
@file_attachments = N'C:\MyPath\SellVsBasePriceDetail.csv';
这能做到吗

将查询结果作为附件发送很容易,但它只发送一个文件

谢谢

基于,这是不可能做到的。从文件系统附加多个文件时,您只能附加多个文件(使用
@file\u attachments=

查询结果始终作为单个文件附加。

基于,这无法完成。从文件系统附加多个文件时,您只能附加多个文件(使用
@file\u attachments=


查询结果总是作为一个文件附加。

我希望这个答案可以帮助其他使用sp\u send\u dbmail发送多个附件的人。我有一个sql server代理任务,将查询结果作为附件发送,部分原因是所附的txt文件保持了正确的格式/网格。以下是脚本:

IF (SELECT COUNT(itemnumber) FROM tblItems WHERE date = Convert(date,Convert(varchar(8), getdate(), 112))) > 0
-- add this condition so that when there is no query result, say over the weekend, your client won't receive an empty email.
BEGIN

 Declare @currentDate varchar(8), @currentDate2 varchar(10), @filename varchar(100), @subjecttxt varchar(100), @weekdayname varchar(10)
 Set @currentDate = Convert(varchar(8), getdate(), 112)
 Set @currentDate2 = Convert(varchar(10), getdate(), 101)
 Set @weekdayname = datename(dw, @currentDate)
 Set @filename = @currentDate + '.txt'
 Set @subjecttxt = 'Results for ' + @weekdayname + ' ' + @currentDate2    

 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'profile_name',
 @recipients = 'test@test.com',
 --@copy_recipients = 'test@test.com',
 @blind_copy_recipients = 'test@test.com',
 @query = 'exec storedprocedure',
 @subject = @subjecttxt,    
 @body = 'mail body.',
 @attach_query_result_as_file = 1,
 @query_attachment_filename = @filename;

END
几个月后,我被要求向同一封电子邮件添加更多附件,这似乎不可能使用相同的sql server代理作业。这是我的解决策略。基本上,您需要添加额外的步骤来运行和输出文件。但该步骤需要作为操作系统(CmdExec)运行:

sqlcmd -S SQLServerName -dDatabaseName -E -Q "Stored Procedure Name" -o "C:\myFolder\myFile.txt"
首先运行此步骤,然后修改Transact-SQL。您还可以将sqlcmd作为批处理文件运行

IF (SELECT COUNT(itemnumber) FROM tblItems WHERE date = Convert(date,Convert(varchar(8), getdate(), 112))) > 0
-- add this condition so that when there is no query result, say over the weekend, your client won't receive an empty email.
BEGIN

 Declare @currentDate varchar(8), @currentDate2 varchar(10), @filename varchar(100), @subjecttxt varchar(100), @weekdayname varchar(10), @file2 varchar(200)
 Set @currentDate = Convert(varchar(8), getdate(), 112)
 Set @currentDate2 = Convert(varchar(10), getdate(), 101)
 Set @weekdayname = datename(dw, @currentDate)
 Set @filename = @currentDate + '.txt'
 Set @file2 = 'C:\myFolder\myFile.txt'
 Set @subjecttxt = 'Results for ' + @weekdayname + ' ' + @currentDate2    

 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'profile_name',
 @recipients = 'test@test.com',
 --@copy_recipients = 'test@test.com',
 @blind_copy_recipients = 'test@test.com',
 @query = 'exec storedprocedure',
 @subject = @subjecttxt,    
 @body = 'mail body.',
 @attach_query_result_as_file = 1,
 @query_attachment_filename = @filename,
 @file_attachments = @file2;

END
现在,您可以使用仅发送一个附件的原始作业发送多个附件

更新:根据,[@file\u attachments=]“file\u attachments”是要附加到电子邮件的文件名的分号分隔列表,可以通过使用分号分隔文件名来添加多个附件。请注意,在分号之后,因为DB mail会将其解释为路径名的一部分


我希望这个答案可以帮助其他使用sp_send_dbmail发送多个附件的人。我有一个sql server代理任务,将查询结果作为附件发送,部分原因是所附的txt文件保持了正确的格式/网格。以下是脚本:

IF (SELECT COUNT(itemnumber) FROM tblItems WHERE date = Convert(date,Convert(varchar(8), getdate(), 112))) > 0
-- add this condition so that when there is no query result, say over the weekend, your client won't receive an empty email.
BEGIN

 Declare @currentDate varchar(8), @currentDate2 varchar(10), @filename varchar(100), @subjecttxt varchar(100), @weekdayname varchar(10)
 Set @currentDate = Convert(varchar(8), getdate(), 112)
 Set @currentDate2 = Convert(varchar(10), getdate(), 101)
 Set @weekdayname = datename(dw, @currentDate)
 Set @filename = @currentDate + '.txt'
 Set @subjecttxt = 'Results for ' + @weekdayname + ' ' + @currentDate2    

 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'profile_name',
 @recipients = 'test@test.com',
 --@copy_recipients = 'test@test.com',
 @blind_copy_recipients = 'test@test.com',
 @query = 'exec storedprocedure',
 @subject = @subjecttxt,    
 @body = 'mail body.',
 @attach_query_result_as_file = 1,
 @query_attachment_filename = @filename;

END
几个月后,我被要求向同一封电子邮件添加更多附件,这似乎不可能使用相同的sql server代理作业。这是我的解决策略。基本上,您需要添加额外的步骤来运行和输出文件。但该步骤需要作为操作系统(CmdExec)运行:

sqlcmd -S SQLServerName -dDatabaseName -E -Q "Stored Procedure Name" -o "C:\myFolder\myFile.txt"
首先运行此步骤,然后修改Transact-SQL。您还可以将sqlcmd作为批处理文件运行

IF (SELECT COUNT(itemnumber) FROM tblItems WHERE date = Convert(date,Convert(varchar(8), getdate(), 112))) > 0
-- add this condition so that when there is no query result, say over the weekend, your client won't receive an empty email.
BEGIN

 Declare @currentDate varchar(8), @currentDate2 varchar(10), @filename varchar(100), @subjecttxt varchar(100), @weekdayname varchar(10), @file2 varchar(200)
 Set @currentDate = Convert(varchar(8), getdate(), 112)
 Set @currentDate2 = Convert(varchar(10), getdate(), 101)
 Set @weekdayname = datename(dw, @currentDate)
 Set @filename = @currentDate + '.txt'
 Set @file2 = 'C:\myFolder\myFile.txt'
 Set @subjecttxt = 'Results for ' + @weekdayname + ' ' + @currentDate2    

 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'profile_name',
 @recipients = 'test@test.com',
 --@copy_recipients = 'test@test.com',
 @blind_copy_recipients = 'test@test.com',
 @query = 'exec storedprocedure',
 @subject = @subjecttxt,    
 @body = 'mail body.',
 @attach_query_result_as_file = 1,
 @query_attachment_filename = @filename,
 @file_attachments = @file2;

END
现在,您可以使用仅发送一个附件的原始作业发送多个附件

更新:根据,[@file\u attachments=]“file\u attachments”是要附加到电子邮件的文件名的分号分隔列表,可以通过使用分号分隔文件名来添加多个附件。请注意,在分号之后,因为DB mail会将其解释为路径名的一部分


正如@Weihui Guo所指出的,您可以用分号分隔多个文件。您还可以通过
@query\u attachment\u filename
@file\u attachments
获得附件。在下面的代码中,两者都会生成一个csv文件,并且生成电子邮件,并将两者作为附件

DECLARE @cmd varchar(1000)
DECLARE @sql varchar(1000)

SET @cmd = 'sqlcmd -S localhost -d MYDB -E -o "C:\MyPath\SellVsBasePriceDetail.csv" -Q "select * from MYDB.dbo.vwSellVsBasePrice order by LocationDescription,Class" -W -w 999 -s","'
EXEC master..xp_cmdshell @cmd

SET @m_sql = 'select * from vwSellVsBasePriceSummary order by LocationDescription,Class'

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'FOO DBMAIL',
@recipients = 'foo@foo.org', 
@subject = @m_subject,
@body = @m_msg,
@body_format ='HTML',
@query = @sql,
@execute_query_database = 'MYDB',
@attach_query_result_as_file=1,
@query_attachment_filename = 'SellVsBasePriceSummary.csv',
@query_result_separator = ',',
@query_result_header = 1,
@query_result_width = 32767,
@query_result_no_padding = 1,
@file_attachments = N'C:\MyPath\SellVsBasePriceDetail.csv';

正如@Weihui Guo所指出的,您可以用分号分隔多个文件。您还可以通过
@query\u attachment\u filename
@file\u attachments
获得附件。在下面的代码中,两者都会生成一个csv文件,并且生成电子邮件,并将两者作为附件

DECLARE @cmd varchar(1000)
DECLARE @sql varchar(1000)

SET @cmd = 'sqlcmd -S localhost -d MYDB -E -o "C:\MyPath\SellVsBasePriceDetail.csv" -Q "select * from MYDB.dbo.vwSellVsBasePrice order by LocationDescription,Class" -W -w 999 -s","'
EXEC master..xp_cmdshell @cmd

SET @m_sql = 'select * from vwSellVsBasePriceSummary order by LocationDescription,Class'

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'FOO DBMAIL',
@recipients = 'foo@foo.org', 
@subject = @m_subject,
@body = @m_msg,
@body_format ='HTML',
@query = @sql,
@execute_query_database = 'MYDB',
@attach_query_result_as_file=1,
@query_attachment_filename = 'SellVsBasePriceSummary.csv',
@query_result_separator = ',',
@query_result_header = 1,
@query_result_width = 32767,
@query_result_no_padding = 1,
@file_attachments = N'C:\MyPath\SellVsBasePriceDetail.csv';