- PR -

DTSSourceオブジェクトの文字列変換

1
投稿者投稿内容
kiyoharu
常連さん
会議室デビュー日: 2005/08/06
投稿数: 25
お住まい・勤務地: 神奈川県鎌倉市
投稿日時: 2006-08-25 02:09
おせわになります。
現在、DTSにてテーブルAからテーブルBにデータをコピーする処理を作成しています。
その際、テーブルAの在るフィールドデータについて文字列判定処理を実施し、
データが保持する文字パターンが一定条件を満たす場合、部分的に文字の置き換えを
実施、その上でテーブルBに格納したいとおもっています。
そこで、テーブルAからテーブルBへのデータ変換タスクで在るフィールドデータに
ついてActiveXスクリプト(VBS)により変換を定義しました。
下記はそのスクリプトの一部です。

<ここから>--------------------------------------
Dim strValue ' 変換前文字列格納変数
strValue = CStr(DTSSource("before"))
<ここまで>--------------------------------------
※DTSSource("before")のbeforeは変換元フィールド名です。

上記のように変換元のフィールドデータ(DTSSourceオブジェクト)を
文字列判定処理前に文字列に変換しようとしたのですが、下記のように
エラーとなってしまいました。

<エラー>----------------------------------------
エラーの説明:型が一致しません。:'DTSSource'
------------------------------------------------

CStr関数をつかってDTSSourceをオブジェクトから文字列に変換をしているつもり
なのですが、上手くいきません。
DTSSourceオブジェクトを文字列に変換するにはどのようにしたらよいのでしょうか。
ご教授の程、よろしくお願いいたします。

<環境>
Windows2000Server (SP4)
Microsoft SQL Server2000 Standard Edition (SP4)

かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-08-25 13:20
before列にnullが入ってるんじゃないかなぁ・・・。
CStr関数って引数がnullだとエラーになるんじゃなかったですかね。
IsNull関数でどうにかしてやればいいのかも。
または、SQLのほうでISNULL(before,'')するとか。
http://www2.jiu.ac.jp/~en/VBSdocs/87.htm
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2006-08-25 20:31
引用:

kiyoharuさんの書き込み (2006-08-25 02:09) より:

<エラー>----------------------------------------
エラーの説明:型が一致しません。:'DTSSource'
------------------------------------------------




お疲れ様です。
TimberLandChapel です。

不思議な現象ですね。
かめたろさんのご指摘のように,CStr に Null 値を放り込むと実行時エラーに確かになりますが,
その場合は,

Null の使用の仕方が不正です:CStr

というエラーになるはずです。
CStr の処理がこけているのであれば,エラーの説明は CStr になるはずです。
一方,ここでは
'DTSSource'
になっていますね。
型変換がエラーを起こしているのではないと思います。

何か再現しないかといろいろ試してみましたが,
'DTSSource'で型エラーは出せていません。

パイプするテーブルの定義などをいただけると,再現性を試せるのですが。

----------
TimberLandChapel
Micorosoft MVP for Windows Server System - SQL Server(Jul 2005 - Jun 2007)
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
kiyoharu
常連さん
会議室デビュー日: 2005/08/06
投稿数: 25
お住まい・勤務地: 神奈川県鎌倉市
投稿日時: 2006-08-27 23:12
おせわになります。
かめたろ様、TLC様、ご回答ありがとうございます。
(リターンが遅れまして、申し訳ありません。)
当現象なのですが以下のようにコードを修正した結果、エラーがでなくなりました。

<旧コード>-------------------------

メインコード(関数AB呼び出し)

Function A()
関数Aの処理
End Function

Function B()
関数Bの処理
End Function
-------------------------------------

<修正コード>-------------------------

Function main()
メインコード(関数AB呼び出し)
End Function

Function A()
関数Aの処理
End Function

Function B()
関数Bの処理
End Function
------------------------------------

関数の呼び出し部にもFunctionでくくることで解消しました。
(お騒がせいたしました^^;)

ところが、エラーは解消されたのですが、格納されたDTSSourceの内容について
よくわからない現象が発生しているのです。

strValue = CStr(DTSSource("before"))

として strValue 自体を
 
 DTSDestination("after") = strValue
 (after は格納先テーブルのフィールド)

とした場合、正常にテーブルに格納されるのですが

strValue = CStr(DTSSource("before"))
strValue2 = strValue
DTSDestination("after") = strValue2

とした場合は、なぜかデータが抜けてしまいます。
(フィールド内は<Null>とも表示されず、空白です。)
strValue2 = strValue の部分の値の渡し方に問題があるのでしょうか?
色々と調べたのですがわかりませんでした。

何かご存知でしたら、何卒よろしくお願いいたします。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2006-08-28 00:22
引用:

kiyoharuさんの書き込み (2006-08-27 23:12) より:

strValue = CStr(DTSSource("before"))
strValue2 = strValue
DTSDestination("after") = strValue2

とした場合は、なぜかデータが抜けてしまいます。




お疲れ様です。
TimberLandChapel です。

更新できない列は,text,ntext 型を使用していませんか?

でない場合は,
スクリプト内で中間変数(vbs ですから,内部処理型〜のバリアントにすべてなってしまいますから)を用いないで
「DTSDestination("after")」をそのまま加工し続けるということができます。

DTSDestination("after") = Replace(DTSDestination("after"),"A","B")

のようにです。

一方,
text,ntext型列には,
このフィールドの更新の形態が異なることから,データをパイプできないはずです。
これらのフィールドにデータをパイプするには,
「照合」を用いて,UPDATETEXT ステートメントなどを発行してあげる必要があります。

いかがでしょう?

----------
TimberLandChapel
Micorosoft MVP for Windows Server System - SQL Server(Jul 2005 - Jun 2007)
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-08-28 09:36
引用:

TLCさんの書き込み (2006-08-25 20:31) より:
かめたろさんのご指摘のように,CStr に Null 値を放り込むと実行時エラーに確かになりますが,
その場合は,

Null の使用の仕方が不正です:CStr

というエラーになるはずです。
CStr の処理がこけているのであれば,エラーの説明は CStr になるはずです。


あー、そっかー。適当なことを書いちゃって余計に混乱させるトコでしたね。スミマセン・・・。TLCさん、フォローありがとうございます。

-------書き込み追加---------------
引用:

TLCさんの書き込み (2006-08-28 00:22) より:
「照合」を用いて,UPDATETEXT ステートメントなどを発行してあげる必要があります。


なるほど!「照合」だけに SELECT だけよって先入観があるけど、そうゆう使い方もありですね!

[ メッセージ編集済み 編集者: かめたろ 編集日時 2006-08-28 09:49 ]
kiyoharu
常連さん
会議室デビュー日: 2005/08/06
投稿数: 25
お住まい・勤務地: 神奈川県鎌倉市
投稿日時: 2006-08-30 21:39
   おせわになります。
   ご返答おくれまして、重ね重ね申し訳ありません。

引用:

かめたろさんの書き込み (2006-08-28 09:36) より:
[あー、そっかー。適当なことを書いちゃって余計に混乱させるトコでしたね。スミマセン・・・。



   いえいえ、勉強になります。
   ありがとうございました。^^


引用:

TLCさんの書き込み (2006-08-28 00:22) より:
「DTSDestination("after")」をそのまま加工し続けるということができます。

DTSDestination("after") = Replace(DTSDestination("after"),"A","B")

のようにです。




   教えていただいたやり方でうまく出来ました。
   ありがとうございました。
   今回、DTS関連のオブジェクトについて自分でも色々と調べたのですが
   まとまった情報を見つけることができませんでした。
   何かあるようでしたら、教えていただけるとありがたいです。。。


   かめたろ様、TLC様、ありがとうございました。
1

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