2016-05-31 32 views
2

我想問一下如何通過一個SSIS變量作爲OLE DB命令在數據流中使用的存儲過程的參數?通過OLE DB命令傳遞一個SSIS變量值作爲SP的一個參數

我試圖寫下面的SQL命令,但不工作: EXEC [dbo]。[CalculateProcess]?,?,?

接收錯誤:(δ值)

No value given for one or more required parameters.

第一和第二值是從平面文件源來作爲ID和名稱。第三個應該是SSIS變量@howMany的值。我該怎麼做?感謝幫助。

編輯:

讓我們假設我的數據集是:

ID NAME 
1 X 
2 Y 
3 Z 
4 
5 A 

在這種情況下,應@howMany在年底爲4。如果當前NAME不爲空,則應在每個OLE DB命令工作後動態更新該值。

ID NAME 
1 X 
@howMany = 1 

2 Y 
@howMany = 2 

3 Z 
@howMany = 3 

4 
@howMany = 3 

5 A 
@howMany = 4 

編輯2: 當我做添加@howMany作爲派生列,它正在發生,如:

ID NAME @howMany 
1 X 0 
2 Y 0 
3 Z 0 
4  0 
5 A 0 

而0值是住,每行後不會得到更新。寫完OUTPUT後?在SQL命令中沒有解決嗎?我的錯誤在哪裏?

編輯3:存儲過程 -

CREATE PROCEDURE [dbo].[CalculateProcess] 
    @ID int, 
    @name varchar(30), 
    @howMany int output 
AS 
BEGIN 
    SET NOCOUNT ON; 
    if (@name is not null) 
    BEGIN 
     set @howMany = @howMany + 1; 
    END 
END 

編輯4:我添加了一個腳本組件獲得平面文件源之後。 Name是INPUT參數,NameCounter是我的輸出列。我的腳本是:

private int nameCounter; 
public override void PreExecute() 
{ 
    nameCounter= 0; 
} 
public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    if (Row.Name != null) 
    { 
     nameCounter++; 

    } 
    Row.NameCounter= nameCounter; 
} 

腳本組件連接到我的OLE DB命令。這將生成一個名爲NameCounter的列,並將其添加到OLE DB命令中的所有數據。現在我只是不知道如何獲得NameCounter的值,並將其分配給SSIS變量?

+0

變量'@ howMany'這是一個輸出變量? –

+0

是的,它是....... –

+0

你可以顯示存儲過程的定義嗎? –

回答

5

OLE DB Command之前使用Derived Column轉換,並將該變量作爲新列添加到數據流中。然後使用新列作爲您的OLE DB Command中的第三個參數。

編輯基於新的問題:

好吧,做你想做的,你可以使用腳本組件是什麼。 Here就是一個例子。如果NAME列不爲空,則增加腳本中howMany變量的值,然後將該變量的值作爲第三列添加。

2日編輯:

要更新腳本的SSIS變量的值,一定要設置變量的讀/寫變量在腳本屬性,不像文章中我上面鏈接。然後:

Dts.Variables["howMany"].Value = nameCounter; 
+0

是的,我正在這樣做。但是,它不起作用。 「@howMany」的默認值爲0.我希望在平面文件中的NAME值不爲空時動態增加此值。當我像你說的那樣做時,「@howMany」對所有數據都爲0。 –

+0

我更新了問題,請您檢查我正在檢查的 –

+0

。會讓你知道。謝謝 –

0

權,因爲你已經提到,@howMany變量是你需要使用OUTPUT子句中的OLE DB Command穿越 - 輸出變量。

EXEC [dbo].[CalculateProcess] ?,?,? OUTPUT 

而作爲標籤Alleman曾建議OLE DB Command穿越 - 前添加一個出列並且在OLE DB Command變換的Column Mapping標籤,其映射到派生列。

現在您已經提到您還希望更新行的總數。

您可以在派生列上的OLE DB CommandSum之後添加一個Aggregate轉換,不進行分組,這會給您更新的總行數。

更新

在這裏你去這裏的問題是,你的存儲過程,可是沒有合適的邏輯,你的@Howmany變量總是空,除非你在運行時值傳遞給它,因爲只有您擁有的值是ID,並且在這種情況下,您的Howmany變量的名稱將始終爲空。

您的存儲過程的邏輯是錯誤的,它應該是這樣的....

CREATE PROCEDURE [dbo].[CalculateProcess] 
    @ID int, 
    @name varchar(30), 
    @howMany int output 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Update TableName --<-- whatever your table name is 
    SET Name = @name 
    WHERE ID = @ID 
    AND Name IS NOT NULL  

set @howMany = @@ROWCOUNT; 

END 
+0

更新了這個問題,解釋了爲什麼我不能使用派生列。 –

+0

@EmelUras可以顯示存儲過程定義嗎? –

+0

已添加到問題中。 –

相關問題