- PR -

BCPを同一トランザクションで

1
投稿者投稿内容
おか
常連さん
会議室デビュー日: 2003/01/31
投稿数: 25
投稿日時: 2004-09-07 11:30
SQL-Server2000(SP3)を使っていますが
BCPやBULK INSERTは現在のトランザクションとは別のトランザクションになる
ようですが同一のトランザクションで実行できないのでしょうか?
やりたいことは
Aテーブルの更新結果をテキストファイルに書き出したいのですが
BCPが排他ロックをかける?ようでブロックされてしまうようです
これはやはりSQL-Serverの仕様として無理なことでしょうか?
一時テーブルを使用しようともおもったのですが別セッションで
一時テーブルをBCPが認識できません。
回避方法があれば教えていただけないでしょうか
よろしくお願いします
tahakoda
ベテラン
会議室デビュー日: 2002/08/17
投稿数: 79
投稿日時: 2004-09-07 12:04
>>一時テーブルを使用しようともおもったのですが別セッションで
>>一時テーブルをBCPが認識できません。

ちょっと意味がわかりません。詳細をいただけますか?。
おか
常連さん
会議室デビュー日: 2003/01/31
投稿数: 25
投稿日時: 2004-09-07 12:59
tahakoda様 ありがとうございます。
詳細についてですが
テーブルAの内容を select〜insert into #table_A from table_A として
#table_Aを作成し#table_Aに対してBCPを実行させようとしたのですが 
「#table_Aが無効です」
というエラーが返ってきました。
ということなのですが、ご理解いただけましたでしょうか

よろしくお願いします。
tahakoda
ベテラン
会議室デビュー日: 2002/08/17
投稿数: 79
投稿日時: 2004-09-07 13:20
#table_Aって確かローカル一時テーブルなので別セッションからは見えないのでは?。グローバル一時テーブルではどうですかね?。ただbcpから別セッションの一時テーブルを参照って聞いたことはないです。

あとbcp実行中に「更新結果をテキストファイルに書き出す」という処理を実行したタイミングでクエリアナライザを新規で立ち上げ「sp_lock」と実行します。
結果でどのリソースがロックされているかわかりますよ。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-09-07 14:04
unibon です。こんにちわ。

本来、BCP などのツールは、「プログラムをたくさん書かなくても簡単に DB の内容をテキストファイルに書き出す(あるいは読み込む)ためのツール」、という位置付けではないです。文字通りバルクコピーをするためのツールだと捉えて使うべきです。
BCP を使わずに DB を SELECT してそれをファイルに書き出すプログラムを書けばできることならば、BCP を使わないほうが良いのではないでしょうか。なお、バルクコピーはトランザクションとして実行することはできないはずです。
おか
常連さん
会議室デビュー日: 2003/01/31
投稿数: 25
投稿日時: 2004-09-08 09:54
unibonさん、tahakodaさんありがとうございました。
BCPを使わない場合だと(VB等で作成する方法)
クライアント、サーバー間でのトラフィック、パフォーマンスが
問題になるように思ったので・・。
本来(?)の使い方ではないようですね。
もしこんな方法でもSQL-Serverでテキストファイルの操作が
できるという手法があれば参考にしたいと思うので教えてください
1

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