2011-07-27 5 views
0

私は単純な作業であるべきものを持っている - SQL実行タスクSQLクエリ結果の数値をデータ型Doubleのパッケージ変数に割り当てるにはどうすればよいですか?

SELECT MainID FROM TableA WHERE TableA_ID = 1` 

(これは一列と1行が返されます。)からResultSetを使用して、ユーザー変数を移入します。

MainIDは現在、データベースにユーザー定義データ型として格納されています。値はXXXX.Yの形式(8008.1など)で保存されます。

UserVariableをStringデータ型に変更すると、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サービスを呼び出すタスク。クエリからResultSetにUserVariableを割り当てようとすると、SQL実行タスクでエラーが受信されます。 – Rob

答えて

2

次のオプションがWebサービスタスクで機能するかどうかはわかりませんが、試してみてください。

私が説明した問題は、データ型がDoubleのSSISパッケージ変数に数値を割り当てる際に、SSISの制限が原因であると考えられます。この問題が報告されている場所でMSDN Connectにthis linkを参照してください。

ここでは、試すことができるオプションを示す簡単なステップバイステップの例を示します。この例はSSIS 2008 R2で作成されました。

SSISパッケージを作成します。私は最初にYYYYMMDD_hhmmの形式でパッケージを命名した後、SOはスタックオーバーフローを示し、SOの質問IDと最後に説明を続けます。これは後で簡単にこれを参照するためのものです。スクリーンショット#1を参照してください。

パッケージでは、StringValueDoubleValueという2つの変数を作成します。変数StringValueを数値(たとえば)に設定します。これは、変数DoubleValueで設定しようとしている式がエラーにならないようにするために必要です。変数DouleValueを選択し、F4を押してプロパティを表示します。 TrueにプロパティEvaluateAsExpressionを設定し、変数するDoubleValue上のデータ型がセルに変更されます。この時点で(DT_DECIMAL, 2) @[User::StringValue]NOTE:からプロパティを設定することは、文字列ではありません。スクリーンショットを参照#2および#3

パッケージで、一部のSQL ServerデータベースへのOLE DB接続マネージャを作成します。ローカルマシン上にあるAdventure Worksデータベースへの接続を作成しました。スクリーンショット#4を参照してください。制御フロー]タブで

Execute SQL Taskを配置し、スクリーンショット#5#6に示すように設定します。 Execute SQLタスクをダブルクリックしてExecute SQLタスクエディタを表示します。 1つの値だけをフェッチするため、ResultSetをSingleRowに設定します。接続文字列をOLE DB接続マネージャーに設定します。 SQLステートメントはSELECT CAST('3.14' AS NUMERIC(10,2)) AS ValueOfPiに設定する必要があります。結果セットは変数StringValueに設定する必要があります。

[コントロールフロー]タブで、[Execute SQL]タスクの後にScript Taskを配置します。このスクリプトタスクは、設定したばかりの式のために、DoubleValue変数に割り当てられる値を表示するだけです。スクリプトタスクをダブルクリックして、スクリプトタスクエディタを起動します。 スクリプトの編集...ボタンをクリックして、VSTAエディタを表示します。 Main()メソッドをScript task code sectionのコードに置き換えます。スクリーンショット#7#8を参照してください。

パッケージを実行します。変数DoubleValueの値がメッセージボックスに表示されます。スクリーンショット#9を参照してください。

希望に役立ちます。

スクリプトタスクコード:のみSSIS 2008 and aboveで使用することができ

C#コード。

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

関連する問題