2017-01-30 111 views
3

下面是我的工作我的存储过程创建“ListDailyInbound855-InputScript.sql 第一份工作(生成文件)创建输出中。 “d:\ DailyReports \ Inbound855.txt”如何检查SQL脚本中的文件是否为空?

sqlcmd -i D:\InputSQLScripts\ListDailyInbound855-InputScript.sql 
-S localhost -E -s " " -o D:\DailyReports\Inbound855.txt 

第二职业(邮件文件)创建一个电子邮件发送出去[email protected]

Declare @ExeFilePath varchar(255) 
Set @ExeFilePath = 'D:\Applications\EmailUtility\Mailer ' 

Declare @cmd varchar(500) 
Set @cmd = @ExeFilePath + ' "Host:smtp.emailserver.com" "To:[email protected] 
company.com" "Cc:[email protected] company.com" "From:[email protected] 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 

问题:我需要先检查输出“d:\ DailyRe ports \ Inbound855.txt“在使用它作为电子邮件的附件 之前是非空的,因此不会将其作为空的接收。我的目标是只有在附件有内容或非空时才会收到电子邮件警报。任何帮助表示赞赏。

+1

从采用主'。 .xp_cmdshell'这可能是一个SQL Server问题,但如果您将问题标记为可能会有帮助(可能使用正确的版本:运行SELECT @@ VERSION)。 –

回答

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 
0

可以使用按照CMD行找出文件大小(在本例中为“c:\ test.txt”):

for %I in ("c:\test.txt") do echo %~zI; 

我们需要将结果导入MSSQL变量。因此,您应该使用EXIT而不是ECHO作为退出代码返回命令的结果。在这种情况下,您可以将其分配给MSSQL变量。

文件不存在时的另一个问题。在这种情况下,您将收到错误,因为%~zI为空。为避免这种情况,只需在%~zI之前添加0即可。所以我们得到00,01,02,..而不是1,2,..当它作为一个EXIT代码输出时,它将被转换为int值0,1,2,3,...如果文件doesn “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

+0

您将如何传递参数而不是硬编码文件位置?文件名称每天都会更改。 – NonProgrammer