SSISにて、一時テーブルを使ったファイルの取り込みがうまく行かない場合がある

このQ&Aのポイント
  • SQL Server 2005のSSISを使用して、並列で一時テーブルを作成し、フラットファイルデータを取り込む処理において、成功と失敗が混在しています。
  • 一時テーブル作成処理は成功しているが、次の処理に移る前にエラーが発生しています。
  • 直列で処理を行うとエラーは発生せず、問題なく処理が完了します。
回答を見る
  • ベストアンサー

SSISにて、一時テーブルを使ったファイルの取り込みがうまく行かない場合がある(その2)

SQL Server2005 のSSISにて、並列で一時テーブル(##tbl1,##tbl2,##tbl3)を作成し、 その作成した一時テーブルに、同じく並列でフラットファイルデータを取り込む、 といった処理を行っています。 ##tbl1作成 ##tbl2作成 ##tbl3作成    ↓      ↓       ↓ ##tbl1取込 ##tbl2取込 ##tbl3取込 こちらの処理について、実行させると成功するときもあれば、失敗する時もあります。 失敗するときは、 [##tbl1 [38]] エラー : "[dbo].[##tbl1]" の Fastload 行セットを開けませんでした。オブジェクトがデータベース内に存在することを確認してください。 や、 [##tbl2 [38]] エラー : "[dbo].[##tbl2]" の Fastload 行セットを開けませんでした。オブジェクトがデータベース内に存在することを確認してください。 といったエラーになります。 一時テーブル作成処理は成功しているのに、何故このエラーが出るのかが分かりません、、 実際には一時テーブルの作成が完了していないのに、次の処理に移っているのでしょうか・・・? また、この処理を並列ではなく、直列にしてやると、エラーは発生しません。 ##tbl1作成    ↓ ##tbl2作成    ↓ ##tbl3作成    ↓ ##tbl1取込    ↓ ##tbl2取込    ↓ ##tbl3取込 どなたかご存知の方、教えて頂けないでしょうか? 以上、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

SSISは並列処理が1つの売りだったりするわけですが、接続マネージャのRetainSameConnectionは「そのセッションをパッケージ完了まで維持する」ことは意味していますが、「そのセッションで全ての処理を行う」ことまでは意味していないということです。 今回のような並列処理で、SSISが並列実行可能と判断すれば、その部分については複数のセッションで接続し、並列実行を行おうとします。 (追加で立ちあがったセッションは並列実行が終われば切れてしまいます) 質問者さんのケースでエラーになる場合、例えば##T2がエラーになったとすれば、 1)最初に立ちあがったセッションが##T1, ##T3を作成 2)その間にもう一つのセッションが立ちあがり、##T2を作成(並列実行)し、そのセッションは切れる 3)最初に立ちあがったセッションが##T1, ##T2, ##T3へのインポート処理を行う ということが起こっているはずです。 (一番いいのはSQL Serverプロファイラで実行中の内容を確認してみることです) この問題を回避する案としては、 1) Packageのプロパティにある「MaxConcurrentExecutables」の値を-1から1に変更します(-1はCPU+2を意味する既定値)。ここを1にすると、並列処理であるものの並列実行はプランされないため、途中で余計なセッションが立ちあがることはなくなりますが、逆にいうとこのステップに関して並列にタスクを組むこと自体にうまみがなくなるということです。 2) 接続マネージャを3本作ってそれぞれに割り当てる。  それぞれが最初から違うセッションで実行されますので、並列実行でも勝手にセッションが立ちあがることはないはずです。  ただ、本当にここまでやる必要があるのかどうかという点だけですね。

junzo_ex
質問者

補足

jamshid6さま いつもご回答ありがとうございます。 なるほど、別のセッションが立ち上がり、 それが切れることで一時テーブルも無くなってしまった、 という事だったのですね、、 頂いたアドバイスを元に、並列処理のうまみを生かしつつ、 接続マネージャを1本でなんとかしようと考え、以下の手法で やってみたところ、うまくいきました!      ##t1作成        ↓      ##t2作成        ↓      ##t3作成   ↓    ↓    ↓ ##t1取込、##t2取込、##t3取込(ここを並列に) この方法なら問題ないですよね??

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

一時テーブル作成を直列にするのであれば、確かに問題はないと思います。

junzo_ex
質問者

お礼

ご回答ありがとうございます! 助かりました!

関連するQ&A

  • SSISにて、一時テーブルを使ったファイルの取り込みがうまく行かない場合がある

    SQL Server2005 の SSISにて、一時テーブルを作成し、 その一時テーブルにフラットファイルを読み込む、 といった処理を行っています。 こちらの処理について、 SSIS インポート及びエクスポートウィザードで 作成した処理であれば問題なく動作するのですが、 手動で作成した処理だと、ウィザードで生成された パッケージと同じように設定しても、 検証の段階で 「##tblのfistload行セットが開けませんでした」 といったエラーメッセージが表示されてしまい、 実行そのものが出来ない状態にあります。 なぜ、ウィザードだと出来て、手動だと出来ないのか。。 プロパティ系の設定はひととおり抑えたつもりです。 どなたか同じ現象を体験した方、 また、解決方法をご存知の方がいらっしゃいましたら 何卒ご教授くださいませ。

  • ストアドの一時テーブル格納について

    ストアドの一時テーブル格納について SQLServer2000を使用しています。 sp_help_jobの結果セットを一時テーブルにいれたく、 以下のようなスクリプトを作成しています。 -------------- create table #tbl (  列名  ・  ・  ・ ) Insert into #tbl msdb.dbo.sp_help_job -------------- スクリプトを実行すると、以下のエラーでInsertに失敗します。 「メッセージ 8164、レベル 16、状態 1、プロシージャ sp_get_composite_job_info、行 72 INSERT EXEC ステートメントは入れ子にはできません。」 上記の改善策についてアドバイス頂けないでしょうか。 よろしくお願いします。

  • BIのSSISで一時テーブルの作成ができない

    Ver:SQLServer2005 SQL Server Business Intelligence の SSIS の、 「SQL 実行タスク」にて、グローバル一時テーブルの 作成を試みたところ、実行結果は問題なく完了となっているのですが、 実際にテーブルの生成がされていませんでした。 また、ストアド上でグローバル一時テーブルを作成するようにし、 そのストアドを実行させて問題なく完了させても、 やはりテーブルの生成がされていませんでした。。 なお、グローバル一時テーブルの削除は問題なくできます。 これは、そもそも出来ない操作なのか、 それとも、何か解決法があるのか、どなたかご教授願えないでしょうか? 恐れ入りますが、なにとぞよろしくお願いいたします。

  • SSISのフラットファイル取込時のテーブル名について

    SSISにてフラットファイル取り込み、 それをデータアクセスモード「SQLコマンド」にて、 一時テーブルに投入したいのですが、そのような事は可能なのでしょうか? 今まではデータアクセスモードを 「テーブルまたはビュー - 高速読み込み」にて行っていたのですが、 接続マネージャを変更すると事前に一時テーブルを作成しておかないと 設定が出来ないため、この手間を省きたく、「SQLコマンド」にて実施したい と考えました。 どなたか方法をご存知の方、ご教授頂ければ幸いです。

  • accessのマクロでODBC接続で外部データをインポートしたいのですが

    accessのマクロでODBC接続で外部データを自動でインポートしたいのですがうまくいきません。「ファイルから外部データの取込みでインポート→ファイルの種類でODBC DATABASES()を選択し、コンピュータデータソース指定→テーブルを指定」ではできたのですが、マクロで以下のように設定したのですがうまくいきません。 アクション・・データベース変換 変換の種類・・インポート データベースの種類・・ODBC データベース データベース名 ODBC;DSN=ACSKNSM1DS;APP=Microsoft® Access;WSID=JYOHO08;DATABASE=ACSKNSM1;Trusted_Connection=Yes;TABLE=dbo.tbl_bank オブジェクトの種類・・テーブル オブジェクト名・・dbo_tbl_bank 変換先名・・銀行T テーブルの構造のみ変換・・いいえ ※銀行Tのテーブルはアクセスのテーブルを作成しました。 どうか宜しくお願い致します。

  • T-SQLで一時テーブルの名前を毎回変更できるストアドを作りたい

    お世話になります。 初歩的な質問で恐縮ですがご教示いただければ幸いです。 T-SQLでグローバル一時テーブルの名前を毎回変更できるストアドを作り、Access2003アプリから実行させる予定です。 ストアドに、CREATE TABLE [dbo].[@tablename]のように書き、 ストアド実行時に@tablenameの値を ##ABC のように入力したのですが、テーブルはtempdbではなく、しかもテーブル名は@tablenameでテーブルが作成されてしまいます。 CREATE TABLE [dbo].@tablename のように[]をとると ストアド自体を作成できずエラーになってしまいます。 宜しくお願いします。 create PROCEDURE [dbo].[ストアドプロシージャー名] (@tablename nvarchar(255)) AS BEGIN from SET NOCOUNT ON; CREATE TABLE [dbo].[@tablename] <以下省略>

  • ストアドをまたがるローカル一時テーブル

    SQL Server 2005 でストアドプロシージャ(以降SPと省略) を作成しています。 複数の SP から、構造が同じローカル一時テーブル (テーブル名が # から始まるテーブル) を使用したい為、 CREATE するだけのローカル一時テーブル作成SP、 DROP するだけのローカル一時テーブル削除SPを、 それぞれ作成しました。 次に、ローカル一時テーブルを使用したい SP 内で、 ローカル一時テーブル作成SP を EXECUTE 後、 ローカル一時テーブルに対し、INSERT をしたところで 以下のようなエラーとなります。 ※INSERT の変わりに、SELECT にしてみても同様でした。 メッセージ 208、レベル 16、状態 0、プロシージャ TEST_SP、行 155 オブジェクト名 '#LocalWorkTable' が無効です。 ※TEST_SP とは、ローカル一時テーブルを使用したい SP の名前  #LocalWorkTable とは、ローカル一時テーブルの名前 グローバル一時テーブル (テーブル名が ## から始まるテーブル) に変更すると、正常に動作しましたが、 セッションをまたがって使用させたくないのです。 あと、 ローカル一時テーブル作成SPを使用せずに、 ローカル一時テーブルを使用したい SP 内で、直接 CREATE すれば 正常に動作しましたが、 上記にも書いたように、複数の SP で構造が同じローカル一時テーブル を使用したいので、できれば、別 SP にしたいと考えております。 ストアドをまたがって、ローカル一時テーブルを使用する事は できないのでしょうか?

  • SSISパッケージの処理失敗時にRollbackさせる方法がわかりません

    SQL Server2005 のSSISにて、 以下のような処理を作成し、 SSISパッケージ1は成功、SSISパッケージ2が失敗と なった場合に、SSISパッケージ1の内容が Rollback されないのですが、 これをRollbackする方法はあるのでしょうか?? ┏━━━━━━━━┓ ┃Begin Transaction ┃ ┗━━━━┳━━━┛         ↓ ┏━━━━┻━━━━━━━┓←シーケンスコンテナ ┃┏━━━━━━━━━━┓┃ ┃┃SSISパッケージ1(dtsx) ┃┃ ┃┗━━━━┳━━━━━┛┃ ┃        ↓         ┃ ┃┏━━━━━━━━━━┓┃ ┃┃SSISパッケージ2(dtsx) ┃┃ ┃┗━━━━━━━━━━┛┃ ┗━━━━┳━━━━━━━┛         ↓ ┏━━━━┻━━━━━┓←失敗時 ┃Rollback Transaction  ┃ ┗━━━━━━━━━━┛ なお、SSISパッケージ1、2共に、 処理内容はシーケンスコンテナ内に入れています。 【SSISパッケージ1、2のイメージ】 ┏━━━━━┓←シーケンスコンテナ ┃┏━━━┓┃ ┃┃処理1 ┃┃ ┃┗━┳━┛┃ ┃   ↓   ┃ ┃┏━━━┓┃ ┃┃処理2 ┃┃ ┃┗━━━┛┃ ┗━━━━━┛ (元々単体でトランザクションを張っていたため、 シーケンスコンテナ内に入れている) どなたかご教授頂けると幸いです。

  • SQLServerで別インスタンスのデータベースのテーブルの結合はできますか?

    [インスタンスA] UserID=sa PassWord=****** DataBase=DB01 で接続されるテーブルDB01.Table1 と [インスタンスB] UserID=HogeUser PassWord=@@@@@@ DataBase=DB02 で接続されるテーブルDB02.Table2 の2つのテーブルを結合してプログラムから処理を行いたいのですが、 可能なのでしょうか。 SQLのイメージは select * from [インスタンスA].[db01].[dbo].[Table1] tbl1 join [インスタンスB].[db02].[dbo].[Table2] tbl2 on tbl1.id=tbl2.id という感じです(もちろん動作しませんが) インスタンスAとインスタンスBは同一マシンにあり、SQLServer2008SP1とします。 開発環境はVS2008SP1でSqlClient.SqlConnectionを使用して接続し、 SqlCommandにてSQLを作成し、実行するような形です。 どうかよろしくお願いいたします。

  • SSIS 変数の値をSQL実行タスクSQLStatementで利用する方法

    初めまして! SSISの変数利用について 教えて頂きたいので よろしくお願いいたします。 SSISの変数に入った値をSQL実行タスクの SQLStatementで利用することは できませんでしょうか? 具体的に何をやりたいかと言いますと データを取り込む為に一時テーブルを使います。 SQL実行タスクで一時テーブルを作成して、 データを取り込み、処理後に一時テーブルを削除します。 素人考えで、もしほぼ同時にパッケージが実行された場合に 一時テーブルの名前がカブっていると不具合の元にならないかと思いました。 そこで、変数の値でテーブル名を動的につけられればと思ったのですが、 変数に入れた値を、 色々調べてみたのですが SQL実行タスクエディタのSQLStatementでどう呼び出せばよいのか分かりません。 例えば、以下のような文で##test_table の部分を変数で指定することはできないのでしょうか? CREATE TABLE ##test_table( [CD] VARCHAR(10), [NAME] VARCHAR(20) ) GO お手数ですが、ぜひ教えてください。 SSISを始めたばかりで 考え方自体がおかしいのかも知れません・・・。 その場合は本当に申し訳ありません どうぞよろしくお願いいたします!