如何在SQL脚本中检查文件是否为空?

时间:2017-01-30 08:32:41

标签: sql-server tsql

以下是我为存储过程创建的作业" 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;在将其用作电子邮件附件之前,它是非空的 因此没有收到空的。我的目标只是在附件有内容或非空的情况下接收电子邮件提醒。任何帮助表示赞赏。

2 个答案:

答案 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.