2016-09-23 85 views
0

我有一個複雜的批處理腳本,涉及多個BCP命令,這些命令用平面文件數據加載SQL服務器。我正在使用將命令的結果記錄到日誌文件中的分支語句。這一切工作正常。將命令結果捕獲到變量中不起作用

結果也會作爲成功或失敗記錄在SQL表中。我試圖做的是,在失敗時,使用我認爲是簡單的重定向的方式將日誌文件的內容插入到SQL日誌表中。它不工作。

以下是我在一個雙贏Server 2012的環境中的批處理文件正在做:

BCP (the parameters here don't matter) >> %LogFile% (
    MOVE %FileName% to Archive/%FileName% 
    sqlcmd -E -Q "EXEC spImportLog 'SUCCESS', %FileName%, '' 
) || (
    SET /p LogText=<%LogFile% 
    sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, %LogText% 
) 

此代碼的執行沒有錯誤。聲明的真實部分正常工作。 錯誤部分執行正常,但我最終得到空字符串而不是 %LogText%的內容。

當運行此從命令提示,SET看起來像這樣:

SET/P LogText < 0Log_2016_9_23.log

的日誌文件%%是一個變量,因爲它是在運行時動態命名基於今天的日期。我不知道小於號後的0是從哪裏來的,或者它是我問題的根源。有任何想法嗎?

+0

我猜在'BCP'命令行最後一個'('...是'BCP'是一個批處理文件?',如果是'call'前面有'&&' LogText'你需要[延期擴展](http://ss64.com/nt/delayedexpansion.html),因爲你正在修改*和*在相同的代碼塊中讀取該變量... – aschipfl

+0

是的,前面有一個&& (。我用BCP(我的參數)>>%LogFile%&&(true語句)||編輯了我的原始代碼(SET/p LogText = <%LogFile%sqlcmd -E -Q「EXEC spImportLog'FAILED',%FileName%,!LogText!) –

+0

延遲擴展設置在批處理文件的開頭並在結束時停止它。 –

回答

0

YADXP。

SET /p LogText=<%LogFile% 
    setlocal enabledelayedexpansion 
    sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText! 
    endlocal 

應該工作。看到關於「延遲擴展」


正如我所說,set /p var=<filename將設置從第一線文件的變量的十億左右SO條目。由於文件累計值並且最初設置爲僅包含一行(AAUI)'無',因此是將從文件讀取的值。

嘗試

for /f "usebackqdelims=" %%a in ("%LogFile%") do set "logtext=%%a" 
    setlocal enabledelayedexpansion 
    sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText! 
    endlocal 

應閱讀%logfile%每一行並依次分配到logtest(每行)的值,這樣,當for終止,logtext將有最後的價值文件的行。

+0

我已經嘗試了上述內容。遠遠不能工作,我嘗試的是在批處理開始時設置延遲擴展,並在所有BCP命令運行完畢後結束它,這是行不通的,沒有錯誤,只是結果相同。我將嘗試將它包裝在sqlcmd語句中,作爲答案顯示,看看這是否有所作用。 –

+0

圍繞sqlcmd語句也無法正常工作。詳細說明,我在初始化LogText變量時用'None'批次,'無'是什麼被插入到我的日誌表,而不是SET/p LogText = <%LogFile%語句的結果。希望有所幫助。 。 。 –

+0

通過在一行中運行三條bcp語句進行了驗證。 LogFile的狀態不變。它仍然是'沒有'。 –

0

好的,謝謝你的帖子。這聽起來不像我想要做的事是可能的。至少不是我嘗試這樣做的方式。我想要的是將%LogFile%的全部內容作爲文本流存儲在變量中,然後將該文本流插入到SQL Server中的varchar列中。回想起來,我在最初的帖子中並不清楚我正試圖解決的問題。我知道我可以將命令結果(多行)存儲在SQL Server的臨時表中。它只是需要使用xp_cmdshell,我希望避免這種情況。