2011-07-27 17 views
0

我有什麼應該是一個簡單的任務 - 從執行SQL任務如何將SQL查詢結果的數值賦給數據類型爲Double的包變量?

SELECT MainID FROM TableA WHERE TableA_ID = 1` 

填充使用ResultSet用戶變量(這隻會返回一列,一列)。

MainID當前作爲用戶定義的數據類型存儲在數據庫中。該值以格式XXXX.Y(例如8008.1)存儲。

如果我將UserVariable更改爲字符串數據類型,則可以毫無疑問地將該值賦值爲CASTing或將ResultSet轉換爲STRING/NUMERIC/FLOAT。

SELECT CAST(MainID as NUMERIC(9,1)) as 'MainID' FROM TableA WHERE TableA_ID = 1; 
SELECT CAST(MainID as FLOAT) as 'MainID' FROM TableA WHERE TableA_ID = 1; 
SELECT CAST(MainID as VARCHAR(10)) as 'MainID' FROM TableA WHERE TableA_ID = 1; 

SELECT CONVERT(NUMERIC(9,1), MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1; 
SELECT CONVERT(FLOAT, MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1; 
SELECT CONVERT(VARCHAR(10), MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1; 

然而,我不能如果用戶變量數據類型是DOUBLE分配的值。我收到以下錯誤信息:

[Execute SQL Task] Error: An error occurred while assigning a value to variable "dUserVariable": "The type of the value being assigned to variable "User::dUserVariable" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object. ".

我是相當新的SSIS所以我如何讓這種轉換要經過一個有點難倒。

任何想法?

+0

由第三方組件所需的用戶變量作爲Web服務請求中的參數。它期望它是一個DOUBLE數據類型。我只需要更新變量,以便正確調用Web服務器。 – Rob

+0

Web服務任務調用Web服務。儘管當我嘗試從查詢中將UserVariable分配給ResultSet時,在執行SQL任務上收到錯誤。 – Rob

回答

2

我不確定以下選項是否可以在Web服務任務中使用,但您可以嘗試一下。

我認爲你所描述的問題是由於在SSIS的限制,同時爲數據類型Double的SSIS包變量分配數值。請參閱this link到MSDN Connect報告此問題的位置。

下面是一個簡單的分步示例,說明您可以嘗試的選項。此示例創建於SSIS 2008 R2

創建一個SSIS包。我在開頭以YYYYMMDD_hhmm格式命名包,SO代表Stack Overflow,後面是SO問題ID,最後是描述。這對我來說很容易在以後回顧。請參閱屏幕截圖#1

在包裏,創建即StringValueDoubleValue兩個變量。將變量StringValue設置爲數字值(比如)。這是必要的,以便我們要在變量DoubleValue中配置的表達式不會出錯。選擇變量DouleValue並按F4查看屬性。物業EvaluateAsExpression設置爲True並設置表達屬性(DT_DECIMAL, 2) @[User::StringValue]NOTE:在這一點上變量的doubleValue的數據類型將變爲Cell是不是字符串。查看截圖#2#3

在包上,爲某些SQL Server數據庫創建一個OLE DB連接管理器。我創建了一個連接到我在本地機器上的Adventure Works數據庫。請參閱屏幕截圖#4

在控制流選項卡上,放置一個Execute SQL Task,並將其配置在截屏所示#5#6。雙擊執行SQL任務以啓動執行SQL任務編輯器。將ResultSet設置爲SingleRow,因爲我們只會提取一個值。將連接字符串設置爲OLE DB連接管理器。 SQL語句應設置爲SELECT CAST('3.14' AS NUMERIC(10,2)) AS ValueOfPi。結果集應設置爲變量StringValue

在控制流選項卡上,在執行SQL任務後面放置一個Script Task。此腳本任務僅顯示由於我們剛剛配置的表達式而將分配給變量DoubleValue變量的值。雙擊腳本任務以啓動腳本任務編輯器。單擊編輯腳本...按鈕以啓用VSTA編輯器。用腳本任務代碼部分給出的代碼替換Main()方法。請參閱屏幕截圖#7#8

執行包裝。變量DoubleValue中的值應顯示在消息框中。請參閱屏幕截圖#9

希望有所幫助。

腳本任務代碼:

C#代碼只能在SSIS 2008 and above使用。

public void Main() 
{ 
    Variables varCollection = null; 
    Dts.VariableDispenser.LockForWrite("User::DoubleValue"); 
    Dts.VariableDispenser.GetVariables(ref varCollection); 

    MessageBox.Show(varCollection["User::DoubleValue"].Value.ToString()); 

    Dts.TaskResult = (int)ScriptResults.Success; 
} 

屏幕截圖:

#1:

1

#2:

2

#3:

3

#4:

4

#5:

5

#6:

6

#7:

7

#8:

8

#9:

9

+0

謝謝Siva!我會給這個鏡頭,看看這是否解決了這個問題。 – Rob

+0

經過進一步測試後,我能夠拉取該值並使用表達式對其進行分配。不幸的是,現在Web服務存在數據問題。但那是另一個問題。再次感謝您有據可查的解決方案! – Rob

+0

我找到了解決Web服務問題的解決方案。而不是使用DT_DECIMAL,我不得不使用DT_R8。之後,Web服務很高興。再次感謝您向正確的方向引導我。 – Rob

相關問題