- PR -

SQL Server 2000 DTS でのストアドプロシージャ実行について

1
投稿者投稿内容
AKKEY
会議室デビュー日: 2005/11/26
投稿数: 19
投稿日時: 2005-11-26 18:34
DTSからのストアドプロシージャ実行について2点質問させて頂きます。
不勉強のため既知の内容もあるかと思いますが、何卒よろしくお願い致します。

ホストからSQLServer2000へのデータ転送を固定長ファイルを介して 行おうとしております。
大まかな処理手順は以下のようになります。

1.ホストから固定長ファイルデータを出力。SQLServer2000が稼動するマシンへFTP転送。
2.SQLServer2000のDTS、「一括挿入」タスクでテンポラリテーブルへデータロード。
3.テンポラリテーブル上のデータの妥当性チェックを行う。
4.妥当性チェックが完了したデータをSQLServer2000上の正規のテーブルへ転送。

上記手順の内、3と4の処理をそれぞれストアドパッケージを用いて作成することを考えております。
また、それぞれのストアドパッケージは処理結果についてOUTパラメータを用いて幾つかの整数値リターンコードを返し、それをDTS側で取得し、次ステップへの振り分けの判断を行いたいと考えております。

DTS側でストアドパッケージからの戻り値を取得し、処理の振り分けを行う方法として2つ考えましたが、それぞれ以下の状況で思うように動作してくれませんでした。

(1).「ActiveXタスク(VBScript)」からストアドパッケージをADO経由で実行し、戻り値を取得する。
⇒VBScriptからADOのexecuteメソッドを使用してOUTパラメータ付きのストアドパッケージを呼び出し、OUTパラメータ内の戻り値を取得しようとしたのですが、うまくいきませんでした。他のメソッドも調べてみたのですが、適当なものが見つかりませんでした。

(2).DTSの「SQL実行タスク」からストアドパッケージを呼び出し、同タスクの「出力パラメータ(グローバル変数)」に戻り値を設定、ワークフロープロパティのActiveXスクリプト上でグローバル変数を取得し、判断の振り分けを行う。
⇒出力パラメータにはレコードセットしか指定できないため、コード値のようなスカラー値には利用できないようでした。

(1)については、VBであれば取得できるようですが、VBScriptには適当なメソッドが用意されていないようでした。

ご教授願いたいのは、

@DTS上でストアドパッケージを実行し、その戻り値(スカラー値)を取得する方法はあるでしょうか。
A戻り値を取得できたとして、ActiveXなどでその戻り値を判定し、次のタスクを実行する方法はあるでしょうか。DTS上で定義されている定数としてDTSTaskExecResult_Success、DTSTaskExecResult_Failureの2つでフローを振り分ける方法はあるのですが、ユーザ定義したコード値で判定し、次のタスクを実行したいと思っております。

不明な点がございましたら返信頂ければと思います。
長文になってしまいましたが、何卒ご教授のほど、よろしくお願い致します。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2005-11-29 13:31
こんにちは。
引用:

@DTS上でストアドパッケージを実行し、その戻り値(スカラー値)を取得する方法はあるでしょうか。


 「ストアドパッケージ」ってストアドプロシージャのことですよね?そう仮定して話を進めます。
SQL実行タスクのSQLステートメントに
 exec ? = ストアド名
って書いてあげて「パラメータ」ボタンを押すとパラメータマッピング画面が出てきます。で、「出力パラメータ」のタブを選んで、適当なグローバル変数にマッピングしてください。

引用:

A戻り値を取得できたとして、ActiveXなどでその戻り値を判定し、次のタスクを実行する方法はあるでしょうか。DTS上で定義されている定数としてDTSTaskExecResult_Success、DTSTaskExecResult_Failureの2つでフローを振り分ける方法はあるのですが、ユーザ定義したコード値で判定し、次のタスクを実行したいと思っております。


次のタスクを右クリックして、ワークフロー⇒ワークフローのプロパティをポイントします。ワークフローのプロパティ画面の「オプション」タブを選んで「ActiveXスクリプトを使用」にチェックを入れて「プロパティ」ボタンをクリックすると、ActiveXスクリプトプロパティ画面が出てきます。そこで分岐の判定をします。
コード:
Function Main()
	If DTSGlobalVariables("月次実行FLG").Value = 0 Then
		Main = DTSStepScriptResult_ExecuteTask
	Else
		Main = DTSStepScriptResult_DontExecuteTask
	End IF
End Function


こんなかんじです。「月次実行FLG」ってのはグローバル変数です。

ご参考になればよいのですが。
AKKEY
会議室デビュー日: 2005/11/26
投稿数: 19
投稿日時: 2005-11-30 00:49
かめたろ さん

返信が遅くなってすみません。回答有難うございました。
以下コメントいたします。

>「ストアドパッケージ」ってストアドプロシージャのことですよね?そう仮定して話を>進めます。
ご指摘の通りです。失礼致しました。

>SQL実行タスクのSQLステートメントに
> exec ? = ストアド名
>って書いてあげて「パラメータ」ボタンを押すと

テストで下記のようなプロシージャを登録し、上記の通りSQL実行タスクに設定してみたのですが、「パラメータの位置が違います」というエラーが出てきてしまいます。
どこか認識の違いはありますでしょうか。
CREATE PROCEDURE TEST01
@retCOde NUMERIC(10) OUTPUT
AS
BEGIN
Set @retCode = 1
END
GO

>パラメータマッピング画面が出てきます。で、「出力パラメータ」のタブを選んで、適>当なグローバル変数にマッピングしてください。

上記の「出力パラメータ」ですが、設定画面を見る限り「行の値」もしくは「行セット」がラジオボタンメニューにあるように、レコード形式のデータしか設定できないようですが間違ってますでしょうか。
今回は戻り値を整数値として取得したいと思っています。


Aについて、
>次のタスクを右クリックして、ワークフロー⇒ワークフローのプロパティをポイントし>ます。ワークフローのプロパティ画面の「オプション」タブを選んで「ActiveXスクリ>プトを使用」にチェックを入れて「プロパティ」ボタンをクリックすると、ActiveXス>クリプトプロパティ画面が出てきます。そこで分岐の判定をします。

了解しました。前のタスクから次のタスクを選んで実行するのではなく、次のタスクの側で変数によって判別するということですね。これでやりたい事を満たすことができます。
有難うございました。

お手数かと思いますが、@について再度ご回答頂けると有難いです。
よろしくお願い致します。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2005-11-30 13:29
こんにちは。
引用:

AKKEYさんの書き込み (2005-11-30 00:49) より:
テストで下記のようなプロシージャを登録し、上記の通りSQL実行タスクに設定してみたのですが、「パラメータの位置が違います」というエラーが出てきてしまいます。
どこか認識の違いはありますでしょうか。
CREATE PROCEDURE TEST01
@retCOde NUMERIC(10) OUTPUT
AS
BEGIN
Set @retCode = 1
END
GO


ありゃ?ホントですね。スミマセン、前回の投稿は動作確認をしていませんでした。
下の件と合わせて代替案を考えてみました。
引用:

上記の「出力パラメータ」ですが、設定画面を見る限り「行の値」もしくは「行セット」がラジオボタンメニューにあるように、レコード形式のデータしか設定できないようですが間違ってますでしょうか。
今回は戻り値を整数値として取得したいと思っています。


間違っていません。

今度は、ちゃんと動作確認をしてます。
@ストアド(DTSで「行の値」を取得するため、結果セットを戻すようにしてます)
コード:
    CREATE PROCEDURE TEST01 AS
    select -2 as 戻り値
    GO


ASQL実行タスク(パラメタを受け取る場合は「?」はいらないっぽいですね)
コード:
    exec TEST01


B出力パラメタのマッピング
「行の値」を選択し、適当なグローバル変数に割り当てる

これでどうでしょう。

また、グローバル変数への値の設定は「動的プロパティタスク」でクエリを使って行うこともできるようです。

工夫すればいろいろできそうですねー
AKKEY
会議室デビュー日: 2005/11/26
投稿数: 19
投稿日時: 2005-12-03 17:02
かめたろさん

コメントが遅れてしまい、すみませんでした。

引用:

今度は、ちゃんと動作確認をしてます。
@ストアド(DTSで「行の値」を取得するため、結果セットを戻すようにしてます)
コード:
    CREATE PROCEDURE TEST01 AS
    select -2 as 戻り値
    GO


ASQL実行タスク(パラメタを受け取る場合は「?」はいらないっぽいですね)
コード:
    exec TEST01


B出力パラメタのマッピング
「行の値」を選択し、適当なグローバル変数に割り当てる

これでどうでしょう。



@〜Bの方法で、取得することができました!
ありがとうございました。。

引用:

また、グローバル変数への値の設定は「動的プロパティタスク」でクエリを使って行うこともできるようです。

工夫すればいろいろできそうですねー



初めてDTSを使用したのですが、奥が深いですね。。
DTSを知っている方は貴重なので、また色々ご教授下さい。。
1

スキルアップ/キャリアアップ(JOB@IT)