[DTS] ActiveX スクリプティング変換でスクリプト実行エンジンを初期化できませんでした。

DTSを実行すると以下のエラーが出力された。

DTSDataPump_E_AxScript_CantInitializeEngine
8262 (x2046)
ActiveX スクリプティング変換でスクリプト実行エンジンを初期化できませんでした。

上記のエラーについていくつか情報があった。

無く子も黙る「SQLDTS.COM」の情報です。
ここでは以下のようなことが書かれている。

通常は、DTS ActiveX Script Host DLL (axscphst.dll)をレジストし直せば修復します。それでも解決しなような場合は、「dtspkg.dll」および「dtspump.dll」をレジストし直してみてください。レジストする場合(インストール先がCドライブの場合)は、以下のコマンドを実行します。

Regsvr32.exe “C:Program FilesMicrosoft SQL Server80ToolsBinnaxscphst.dll”
Regsvr32.exe “C:Program FilesMicrosoft SQL Server80ToolsBinndtspkg.dll”
Regsvr32.exe “C:Program FilesMicrosoft SQL Server80ToolsBinndtspump.dll”
(SQL Server 2000)

そして、それでもダメなら?WSHをインストールし直せ!

Windows Server 2003用のWindows Script 5.6は以下のページでDLできます。

しかし、以下のような情報もある。

これから検証です( ´ー`)フゥー...

てか、これってBUGというと思うんだが。
現状、SQL Server 2000にはSP4も最新のパッチも適用している。

[DTS] ActiveX スクリプティング変換でスクリプト実行エンジンを初期化できませんでした。

[DTS] スケジュール起動で、何故かエラーになる? その2

今現在、エラーが出ることなく動いてるのだが!
原因は不明・・・ (゚д゚lll)

そして・・・

致命的なエラーとしかエラーログに残らないのは、エラーを取得していないためだということにようやく気がついた (´ヘ`;)

On Error Resume Next ステートメントを設定していないときに実行時エラーが発生すると、そのエラーは致命的なエラーとなり、エラー メッセージが表示されてプログラムの実行が停止します。

VBScript ランゲージ リファレンス – On Error ステートメント

そこでデータ変換タスクで発生しているエラーを取得することに。

しかし、ここで疑問。
DTSのエラーログにどうやってハンドルしたエラーを書き出すんじゃ?一生懸命ググるも何にも成果なし・・・。同じようなことで悩んでいる人は、随分前にいた。

なので、どうしようかと無い頭で考えた。

  1. データ変換タスクの変換スクリプト内でエラーを取得し、グローバル変数にセット
  2. グローバル変数にセットした値をSQL実行タスクで、エラーテーブルにInsert

単純にこういうこと(常識?)

ほんとうにこんな風にするのか知らんけど、
もう藁をも掴む感じで以下のコードを追記。

On Error Resume Next

‘ 処理コード

If Err.Number <> 0 Then
DTSGlobalVariables(“ErrPackage”).Value = “TestPackage”
DTSGlobalVariables(“ErrNumber”).Value = Err.Number
DTSGlobalVariables(“ErrDescription”).Value = Err.Description
DTSGlobalVariables(“ErrSource”).Value = Err.Source
DTSGlobalVariables(“ErrTime”).Value = Now

Main = DTSTransformStat_Error
Else
Main = DTSTransformStat_OK
End If

でワークフローで失敗したときに、書き出したグローバル変数をSQL実行タスクで書き出します。うーん。今のところ謎の「致命的なエラー」が発生しないため、拾えるか不明です。。。

[DTS] スケジュール起動で、何故かエラーになる? その2

[SQL Server 2000] 大容量メモリを使うには?

SQL Server 2000 SP4以降の累積パッチ
を適応しようとして、とんでもないことに気が付きました(;´Д`) 現在、あるシステムはWindows Server 2003 Enterprise Edition(32bit)
上で動作しており、メモリも8GB搭載してます。

しかーし!!

その大容量のメモリを使うための設定を何もしていなかったのですヽ(;´Д`)ノ バカァ~

つまり。

現状だと8GBのメモリが載っていても、2GBしか使われていないということになります。まったくもって一大事であります (;´∀`)・・・うわぁ・・・

続きを読む “[SQL Server 2000] 大容量メモリを使うには?”

[SQL Server 2000] 大容量メモリを使うには?

DTS:何故かエラーになる? その1

以前はスケジュールで起動したら「dtsrun.exe」がかえってこなくなったんだけども、今度はアプリケーション エラーが発生!!

文句を言ってもはじまらんので、
腹をくくってトラブルシュート (゚Д゚#) !!!

SQL Server 2000でのお話。

日次でSQL Server Agentでスケジュールを組んで実行しているパッケージが、たまに失敗する。失敗したパッケージを手動でEnterprise Manager上から実行すると!?問題なく成功する。そもそも失敗するはずはないのに。

何故?

該当するパッケージは、パッケージ実行タスクを3層に分割して作成したもので、失敗するのは最下層のある特定のパッケージのみです。他のものは問題なく成功しているにもかかわらず、特定のパッケージのみなのです。しかも、再現性があるものでもない。

何故?

このことに関連するKBとして以下のものがあります。

[INF] 定期ジョブとして DTS パッケージを実行する方法

内容としてはセキュリティ コンテキストが異なるので注意しろという内容でして、実際に動作しているので今回の件とは関係ないと判断。

じゃぁ、何でよ?と思っていたら、今朝の実行結果では
「DTSRUN.exe」でアプリケーションエラーが発生していやがった。。。

(/´∇`)/ ~Φ

同時にSQLSERVERAGENTでイベントIDが318のものが
「Unable to read local eventlog (reason: システム コールに渡されるデータ領域が小さすぎます。). 」
という内容でエラーになっていた。
このエラーについては、以下のKBを見る限り無視。

PRB: SQL Server エージェントがイベント ID 318 のアプリケーションがデフォルトのデバッガのワトソン博士との Unhandled Exception エラーを生成すると、エラーを報告することがあります。

そこで、同じような問題に遭遇した人はいないものか?と検索。
そしたら、Σ(゚Д゚ υ) イタ!!

Google グループ : microsoft.public.sqlserver.server
SQL Server ユーザーグループ > コミュニケーション > 掲示板 > SQL Server 1年生にて「DTSのデータ変換タスクについて」で検索。

以上の内容から「データ変換タスク」の「挿入バッチ サイズ」を指定するように変更してみることにした。そもそも、この「挿入バッチ サイズ」と「DTSRUN.exe」との間に因果関係があるのか?まったくもって不明なんだけども。

この辺の内容って、リソキとかには書いているのだろうか。。
手元に無いから確認できんけども。

また、同時にエラーも漏らさず取得するために以下の2点も見直した。
(詳しいことはBOLで確認してください)
DTS パッケージ ログ
行レベルのエラーの検出

後はエラーが起こったときに、原因がわかることを祈るばかり・・・(,,゚Д゚)†

DTS:何故かエラーになる? その1

SQL Server 2000: DTSの起動スケジューリング

SQL Server AgentのジョブでDTSパッケージを起動する。
DTSを起動する際には「DTSRUN」ユーティリティを利用する。
いや、ほんとに、ただこれなんですけどね。やりたいことは。

ジョブで起動するときのコマンドは、例えば以下のようになります。

dtsrun /S localhost /U sa /P password /N SampleDataLoad

「/A」オプションでDTSパッケージのグローバル変数にパラメータをセットすることもできます。

dtsrun /S localhost /U sa /P password /N SampleDataLoad /A Test1_ID:8=TEST1

複数指定する場合は

dtsrun /S localhost /U sa /P password /N SampleDataLoad /A Test1_ID:8=TEST1 /A Test2_ID:8=TEST2

また、「:」の後ろにはグローバル変数のデータ型を指定する必要がありますんで、「dtsrun ユーティリティ」で何を指定すればいいかをご確認ください。

んで。

「dtsrun.exe」を含んだコマンドを単純に実行したところ問題なく完了したが、いざジョブとして設定すると何故か?エラーになる。また、正常に動作したと思ったら、dtsrun.exeが起動したままになり、返事が無い。もちろん、エラーも出ない。

モウイヤダ。

今一度、環境のほうを確認。SQL Server 2000のサービスパックが1つも適用されていないではないですか!(大きなミステイク)なりふりかまわず、SP4を適用。再起動後のジョブは失敗したが(これまた意味不明)、テーブル再作成後は正常に処理が完了することを確認( ´ー`)フゥー...

dtsrun.exeが起動したままになる問題は、SPが当たっていなかったためだと思われます。当ててないワシもワシですが、当てないとこんな基本的なこともまともに動かないことには・・・(自粛)。えっと、下記に本件に関連しそうなKBです。

また、SQL Server Agentの使い方などは、以下にまとめられてます。

SQL Server 2000: DTSの起動スケジューリング

DTS:OracleからSQL Serverにデータを取り込む

「今更こんなこと書いても見る人なんていないんだろうなぁ。。」
と思いつつ書きます。
——————————

やりたいことは、SQL Server 2000のDTSでOracleに対してクエリを発行し、
データ変換タスクで取り込むという非常に単純なこと(;´Д`)
そして、クエリには動的にパラメータを設定する必要がある。

まずOracleと接続するためのドライバ。SQL Server 2000に入っているOracle用のドライバは今となっては使えません。
詳しくは、BOLの「データ変換に関する注意」で確認してください。

今回対象となるOracleは9iなので、この時点で使えない。
また、UNICODEの送信に対応してないので、問題なく使えない。

上記の内容は確かではないので、現在調査中

なので、Oracle Clientをインストールし、「Oracle Provider for OLE DB」を使ってやることに。そして、ここで更に問題が発生。。

OracleとSQL Server用の接続を作成し、その二つをデータ変換タスクで接続。
つまりは、データポンプタスクにて実装します。

しかし、「クエリのパラメータに値を渡せない」のです。
こうやったら出来ます!なんてことを知っていたら、教えてください。。

じゃぁ、どうやんのか?

答えはSQLDTS.comにありました。

読んでもらえればわかると思いますが、やり方としてはパラメータをセットしたクエリをActiveXスクリプトでデータポンプタスクの「SourceSQLStatement」プロパティにセットするということ。

なるほど!と同時に、何でこんなことも出来ないの?と思いましたね (´ヘ`;)

この辺のことってネット上で色々調べてみましたが、見かけませんでした。
もう既に常識なのか?普通はこんなことしないのか?よーわかりませんが、
SQL Server 2000のDTS、ちょっとした変換をかけようとするだけでも
基本的にスクリプトを書かないといけません。そして「型が違う」と怒られる。
まぁ、このへんは慣れなんでしょうが、普通に( ゚Д゚)マンドクセー

SQL Server 2005ではどれぐらい使い勝手がよくなっているのか、
まったく触ってないのでわかりませんし、興味も薄れてきましたが
まぁ、作りこめば何でもできる!という基本スタンスは変わらないんだろうなぁ・・・

こういったツールの使うことは、誰でもできる。
問題は、何をやりたいのか?を決めれるかどうか。

DTS:OracleからSQL Serverにデータを取り込む