Sma*_*uys 3 sql-server t-sql sql-server-2008-r2
我以为你只需要用 a 分隔两个文件名,;
但我的语法失败并出现错误
Msg 102, Level 15, State 1, Line 251
Incorrect syntax near '@filename2'.
Run Code Online (Sandbox Code Playgroud)
这是我的完整语法,我需要做什么才能将两个文件附加到我的电子邮件中?
Declare @filename1 varchar(max), @filename2 varchar(max)
Set @filename1 = 'C:\Testfiles\Test1.csv'
Set @filename2 = 'C:\Testfiles\Test2.csv'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Mod',
@from_address = 'modis@modisglobal.com',
@recipients= 'rsmith@gmail.com',
@subject= 'Test Email',
@body = @body1,
@file_attachments = @filename1;@filename2;
Run Code Online (Sandbox Code Playgroud)
分号是语句终止符,您没有正确转义您的附件。换句话说,你已经做到了:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Mod',
@from_address = 'modis@modisglobal.com',
@recipients= 'rsmith@gmail.com',
@subject= 'Test Email',
@body = @body1,
@file_attachments = @filename1;
@filename2; -- Syntax Error
Run Code Online (Sandbox Code Playgroud)
按照MSDN文章上sp_send_dbmail
:
[@file_attachments=] 'file_attachments'
是要附加到电子邮件消息的以分号分隔的文件名列表。列表中的文件必须指定为绝对路径。附件列表的类型为 nvarchar(max)。默认情况下,数据库邮件将文件附件限制为每个文件 1 MB。
你需要这样做:
Declare @filenames varchar(max)
Set @filenames = 'C:\Testfiles\Test1.csv;C:\Testfiles\Test2.csv'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Mod',
@from_address = 'modis@modisglobal.com',
@recipients= 'rsmith@gmail.com',
@subject= 'Test Email',
@body = @body1,
@file_attachments = @filenames;
Run Code Online (Sandbox Code Playgroud)
如果您想以编程方式添加附件,您可以这样做(注意第二个和第三个文件如何以分号开头):
DECLARE @filenames varchar(max)
DECLARE @file1 VARCHAR(MAX) = 'C:\Testfiles\Test1.csv'
SELECT @filenames = @file1
-- Optional new attachments
DECLARE @file2 VARCHAR(MAX) = ';C:\Testfiles\Test2.csv'
DECLARE @file3 VARCHAR(MAX) = ';C:\Testfiles\Test3.csv'
-- Create list from optional files
SELECT @filenames = @file1 + @file2 + @file3
-- Send the email
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Mod',
@from_address = 'modis@modisglobal.com',
@recipients= 'rsmith@gmail.com',
@subject= 'Test Email',
@body = @body1,
@file_attachments = @filenames;
Run Code Online (Sandbox Code Playgroud)