- - PR -
DTSからストアドプロシージャの結果を取得する方法について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-01-09 17:41
[OSのVER]:Windows Server 2003
[SQLServerのVER]:SQLServer2000 DTSパッケージからSQL実行タスクを使ってストアドプロシージャを実行しています。 そのストアドプロシージャの処理結果(成功/失敗)を取得して、DTSのグローバル変数に格納し、後続のActive Xスクリプトタスクでそのグローバル変数を読んでエラー処理をしようと考えてます。 ところが、ストアドプロシージャ内でINSERT分を実行している場合に戻り値をうまくハンドリングができません。 [SQL実行タスクのSQL Statementに記述している内容] declare @SPRET int, @SpResult int exec @SPRET = SpTest @SpResult OUTPUT select @SPRET as SPRET, @SpResult as SpResult で、結果をそれぞれDTSのグローバル変数 SPRET、SPRESULTへマップするよう設定しています。 [ストアドプロシージャの中身] (実際はいろんな処理をしているのですが、問題をわかりやすくするために簡単なものにしています) drop proc sptest go create proc sptest ( @SpResult int OUTPUT ) as INSERT INTO tableA ..... select @SpResult = 2 return 3 [後続のActiveX スクリプトの中身] Function Main() msgbox "SPRET is " & DTSGlobalVariables("SPRET").Value msgbox "SPRESULT is " & DTSGlobalVariables("SPRESULT").Value Main = DTSTaskExecResult_Success End Function このDTSを実行すると、sptestの結果はDTSのグローバル変数に反映されずに、初期値が表示されてしまいます。(初期値はともの0を設定) ストアドプロシージャsptestのINSERT分をコメントアウトすると、期待する結果 3と2 が返ります。 この現象はどう解釈/解決すればいいのか、悩んでおります。 どなたか、この件でアドバイスがあれば、ご教授いただきたいのですが。 よろしくお願いします。 [ メッセージ編集済み 編集者: crab 編集日時 2007-01-10 12:45 ] | ||||
|
投稿日時: 2007-01-09 18:34
後続のreturn 3 が実行されていないのでは?
つまり INSERT INTO tableA ..... でDBの例外が発生している 実行するプロシージャ事体をdrop & create しているのも気になります | ||||
|
投稿日時: 2007-01-09 20:59
99ri様、
コメントありがとうございます。 >後続のreturn 3 が実行されていないのでは? >つまり >INSERT INTO tableA ..... でDBの例外が発生している DTSからではなく、直接 declare @SPRET int, @SpResult int exec @SPRET = SpTest @SpResult OUTPUT select @SPRET as SPRET, @SpResult as SpResult go とすると問題なく動作するので、プロシージャ自体には問題無いと考えてます。 実際そのテーブルに正しくデータがINSERTされていてます。 >実行するプロシージャ事体をdrop & create しているのも気になります 紛らわしくてすみません。 プロシージャの定義用のスクリプトをそのまま載せました。 実際は、DTSを実行する前にちゃんとプロジャーは存在します。
[ メッセージ編集済み 編集者: crab 編集日時 2007-01-09 22:58 ] | ||||
|
投稿日時: 2007-01-10 10:04
1.テーブルをみるとINSERTは成功しているが DTS後続のActiveXスクリプトに結果が引き継がれない 2.INSERTをコメントにするとDTS後続のActiveXスクリプトに結果が引き継がれる 3.ストアドプロシージャの違いはINSERTの有無のみ 4.プロシージャの結果は DTSGlobalVariables("SPRET").Value DTSGlobalVariables("SPRESULT").Value で参照している となるとトランザクション関係でしょうか? | ||||
|
投稿日時: 2007-01-10 12:27
99ri様、
コメントありがとうございます。 いろいろ検索してみたら、似たような現象を以下で見つけました。 http://www.experts-exchange.com/Databases/Q_21703169.html Solutionを見るためにお金払わないといけなかったんですけど... それで、ストアドプロシジャの先頭で SET NOCOUNT ON コマンドを実行したところうまく戻り値を取得できました。 この例でいくと、INSERT文を実行したときに、RETURN 3の前に(1 row(s) affected)と処理結果が返ってきて、それをDTSが拾おうとしてうまく戻り値が取得できなかったようです。 また、同じようにPRINT文を入れると、やっぱり戻り値を取得できませんでした。 create proc sptest ( @SpResult int OUTPUT ) as SET NOCOUNT ON -- *追加* INSERT INTO tableA ..... select @SpResult = 2 return 3 DTS側が最初に返す結果セットを読むことになるので、途中の処理で余計な結果を返さないようにしないといけないんですね。 ありがとうございました。 |
1