MSSQL 2008
也许我只是在寻找错误的地方。 这是场景:
我们将文件存储在varbinary(max)列中。 我想将这些作为单独的文件以及附近存储的文件的名称选择为单个文件附件。
可以这样做吗?
将查询结果作为附件发送很容易,但它只发送1个文件。
由于
答案 0 :(得分:2)
基于the docs,无法做到这一点。从文件系统附加文件时,您只能附加多个文件(使用@file_attachments=
)。
查询结果始终作为单个文件附加。
答案 1 :(得分:1)
我希望这个答案可以帮助使用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代理作业。这是我作为解决方法的策略。基本上,您需要添加一个额外的步骤来运行sqlcmd并输出文件。但该步骤需要以 操作系统(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
现在,您可以使用仅发送一个附件的原始作业发送多个附件。
更新:根据documentation,[@ file_attachments =]'file_attachments'是一个以分号分隔的文件名列表,可以附加到电子邮件中,可以使用分号添加多个附件分隔文件名。请注意分号后的no space is allowed,因为DB邮件会将其解释为路径名的一部分。
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'profile_name',
@recipients = 'email@domain.com',
@subject = 'subject',
@body = 'body',
@file_attachments = N'C:\Documents\attachment1.txt;C:\Documents\attachment2.txt';
答案 2 :(得分:1)
正如@Weihui Guo 指出的那样,您可以用分号分隔多个文件。您还可以通过 @query_attachment_filename
和 @file_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';