0

我正在開發並於2012年SQL測試的SSIS包從文本文件導入行到一個臨時表(即每次執行之前截斷)使用腳本任務。然後使用Execute SQL任務運行存儲過程,然後該存儲過程查詢登臺表並格式化數據以插入到最終表中。存儲過程失敗在執行SQL任務,但手動成功

目前我只用兩個不同的文件測試。這些文件是每天收到的獨立電子郵件,我在Outlook中配置爲另存爲文本文件。每個文件都重命名爲YYYYDDMM_HHMMSS_ [文件名] .txt。我的SSIS包使用For Each循環將該文件名分配給一個變量@AckFileName,該變量傳入我的存儲過程並從中解析文件日期時間。

所以我的存儲過程的第一行是:

SELECT DISTINCT CONVERT(datetime,left(@AckFileName,8)+' '+substring(@AckFileName,10,2)+':'+substring(@AckFileName,12,2)+':'+substring(@AckFileName,14,2)) 

當我在SSMS運行存儲過程是否能夠正常工作:

Exec [dbo].[ParseAckFile] @AckFileName 

然而,即使我有同樣的相同代碼對於我執行SQL任務中的SQL語句,我收到以下錯誤:

"Exec [dbo].[ParseAckFile]..." failed with the following error: "Conversion failed when converting date and/or time from a character string." 

好吧,所以這似乎很簡單/足夠明顯...除了我的存儲過程中的查詢將字符串轉換爲日期時間,所以它應該也會在手動運行時返回一個錯誤,是否正確?我已經用每個文件測試過了,結果是一樣的 - proc可以用任何一個文件手動運行,但執行SQL任務失敗。

此外:我試着在Execute SQL任務中設置Delay Validation = True,使用OLEDB或ADO.NET連接到我的最終表,並使用Execute SQL任務中的表達式構建我的查詢。這些嘗試都沒有對我收到的錯誤消息產生任何影響。

我可以嘗試其他建議嗎?

+0

你試過看探查器跟蹤,以驗證您的SSIS包發送你認爲它是參數值? –

+0

是@TabAlleman,參數中的文件名是我期待的。我只是發現了一些東西 - 爲了測試,我在存儲過程中對文件名進行了硬編碼,然後從Execute SQL命令中刪除了參數。它工作正常。現在我想知道,即使我的參數是Varchar,如果我可能需要將它封裝在proc中的單引號內?我需要做更多的測試...... –

回答

0

花了一下午的測試後,我終於想通了什麼問題是......因爲我的For Each循環進行檢索,我最終被傳遞給該存儲過程的文件名,它所含的完整的UNC路徑/名文件 - 我知道。但是,當在SSIS中查看變量值時,它顯示了我腳本任務中使用的格式的路徑名 - \\ [server \ [folder \ [subfolder] \ [filename] - 所以我錯誤地在我的REPLACE命令中使用了精確的語法存儲的proc在將它傳遞給我的插入查詢之前更新@AckFileName變量。一旦我找出我的錯誤並糾正錯誤,該軟件包運行良好!

相關問題