以下是我为存储过程创建的作业" ListDailyInbound855-InputScript.sql。 第一份工作(生成文件)创建输出" D:\ DailyReports \ Inbound855.txt"
sqlcmd -i D:\InputSQLScripts\ListDailyInbound855-InputScript.sql
-S localhost -E -s " " -o D:\DailyReports\Inbound855.txt
第二份工作(电子邮件文件)会创建一封发送至support@company.com的电子邮件。
Declare @ExeFilePath varchar(255)
Set @ExeFilePath = 'D:\Applications\EmailUtility\Mailer '
Declare @cmd varchar(500)
Set @cmd = @ExeFilePath + ' "Host:smtp.emailserver.com" "To:EDISupport@
company.com" "Cc:support@ company.com" "From:support@ company.com"
"Disp:EDI Support" "Sub: Daily Inbound 855 Report" "Msg:Please find
report attached." "Atch:D:\DailyReports\Inbound855.txt"'
Declare @output int
Exec @output = master..xp_cmdshell @cmd,no_output
If @output <> 0
Begin
RaisError('Error while sending email.', 16, 1)
Return
End
问题:我需要先检查输出&#34; D:\ DailyReports \ Inbound855.txt&#34;在将其用作电子邮件附件之前,它是非空的 因此没有收到空的。我的目标只是在附件有内容或非空的情况下接收电子邮件提醒。任何帮助表示赞赏。
答案 0 :(得分:2)
由于您已经在使用可执行文件,因此最好的方法是修改它以包括检查为空;假设你有源头。
作为替代方法,您可以尝试使用以下查询将文件加载到记录集中:
SELECT * FROM OPENROWSET(BULK N'<filename>', SINGLE_CLOB ) AS Contents -- for ASCII/ANSI
SELECT * FROM OPENROWSET(BULK N'<filename>', SINGLE_NCLOB) AS Contents -- for UNICODE
然后使用其他语句检查结果:
DECLARE @LEN INT
SELECT @LEN = Len(Contents.BulkColumn) FROM
OPENROWSET(BULK N'<filename>', SINGLE_CLOB) AS Contents
IF @LEN > 0
BEGIN
-- rest of code
END
答案 1 :(得分:0)
您可以使用以下CMD行查找文件大小(在此示例中为&#34; c:\ test.txt&#34;):
for %I in ("c:\test.txt") do echo %~zI;
我们需要将结果输入MSSQL变量。因此,您应该使用EXIT
而不是ECHO
来返回命令的结果作为退出代码。在这种情况下,您可以将其分配给MSSQL变量。
文件不存在时的另一个问题。在这种情况下,您将收到错误,因为%~zI
为空。为避免这种情况,只需在0
之前添加%~zI
即可。所以我们得到00,01,02,而不是1,2,..当它作为EXIT代码输出时,它将被转换为int值0,1,2,3,...如果文件没有& #39; t存在,你得到0。
以下是测试脚本:
DECLARE @output int
EXEC @output = master..xp_cmdshell 'for %I in ("c:\test.txt") do EXIT 0%~zI;',no_output;
SELECT @output;
如果@output = 0
,则文件不存在或文件大小为0.