2017-01-30 86 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