2014-04-22 15 views
0

在2008 SSIS我有一個foreach循環會從表中取一個單一的結果值,並把它放在一個變量文件的執行SQL任務系統任務。 SQL代碼是類似於:SSIS SQL執行由設置單行結果造成工作差錯,但沒有行被返回

SELECT productcode 
FROM products 
WHERE eancode = ? 

的代碼將表的產品回報的產品代碼,如果相應的eancode匹配。 ?是從圖像文件名派生的SSIS中的變量。

基本上,包(環路+ sqltask + FStask)將文件名改變從eancode到PRODUCTCODE。

有時包會失敗,因爲SQL任務嘗試獲取產品代碼但無法返回結果。如果表中不存在eancode,則會發生這種情況。

可以做些什麼來應對這樣的錯誤,因此該循環不停止?

我想這些可能的解決方案:

  1. 使用ISNULL(產品代碼, '替代')是不是一種選擇。結果 集將用於一個變量,該變量將用於重命名圖像的文件名 。這將導致每一個沒有結果的圖像都會得到'替換'名稱 。此外,它只是不會返回任何東西,而不是 即使是isnull更換。

  2. 更改exec SQL任務或ForEach循環的屬性設置, 因此,它跳到下一個,但哪個和哪個?

  3. 從SQL任務添加失敗優先約束到另一個(子) 任務。但是它應該導致什麼任務?如果在sql任務中沒有結果集,它基本上什麼也不做。

  4. 改變約束來完成,但這樣會導致文件系統的任務,因爲它缺少值目標filepathname給出一個錯誤。如果sql任務失敗,它不應該在下一個任務中重命名該文件。

理想的情況是,如果sql任務因沒有結果集而失敗,那麼當前循環將離開SQL步驟並繼續下一輪。

感謝

回答

1

這應該保證行返回每一次,那麼你就可以制定出如何忽略NULL在後續步驟。

但其中參數去當你點擊參數按鈕SSIS可能是太愚蠢鍛鍊。

SELECT TOP 1 productcode 
FROM (
SELECT productcode 
FROM products 
WHERE eancode = ? 
UNION ALL 
SELECT NULL 
) As F 
ORDER BY productcode DESC 
+0

PS SSIS可能是這個錯誤的工具。創建程序邏輯並不是那麼靈活,甚至當你把它埋在表達式和約束條件下等等。 –

+0

謝謝@ElectricIama,我將嘗試查詢並找到一種方法來在下一步中處理null。我相信你對ssis沒有成爲最佳工具有點意見。你碰巧知道哪些工具更靈活,值得一看? – J3FFK

+0

就我個人而言,我會使用VBScript,但實際上它是任何您熟悉的語言。現代的選擇是Powershell。如果你想學習新的東西,並且你認爲你會像這樣做更多的Windows腳本,你應該學習PowerShell。我認爲人們假設它是與SQL Server數據相關的,你需要使用SSIS,但事實並非如此。 –

0

您可以評估從查詢填充的變量值,並添加一個條件,成功約束檢查變量的值。我舉了一個簡單的例子,但希望它有幫助。

我用這個功能:U設置在結果集的一些數據

LEN(@[User::Variable]) > 0 

enter image description here

enter image description here

+0

我正在展示SSIS 2012,但功能也存在於2008年以及將表達式添加到約束。 – Vinnie

+0

謝謝@Vinnie,2008年我嘗試過,但問題仍然存在。執行SQL任務仍然返回無結果錯誤,因此它不能在約束中放置任何值。我發現這個視頻是用foreach循環中的一個序列容器來解決的:http://youtu.be/CqLjL44DSQk – J3FFK

0

唯一原因。所以可能是結果集數據與您的sql執行任務不匹配。所以請檢查它的結果集和傳遞變量都應該匹配