質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

1回答

2856閲覧

一時テーブルを使用する2種類のストアドを同時に実行した際のエラーについてご教示お願いいたします。

Y.ISHII

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2022/09/08 08:59

編集2022/09/09 06:42

前提

・RDBMSは「SQL Server 2019」
・2つ(2種類)のストアドで同じ名前の一時テーブルを定義し、使用している。
・2つのストアドは同時に実行されることがある。
・2つのストアドは別コネクション(接続)から実行される。

発生していること・実現したいこと

2つのストアドが同時に実行された場合に、
一方のストアドで共通の名前の一時テーブルをTRUNCATEした際に、以下のエラーが発生する。

エラーの原因をご教示お願いいたします。

エラーメッセージ

コード:3930  説明:「現在のトランザクションはコミットできず、ログファイルに書き込む操作をサポートできません。トランザクションをロールバックしてください。」

試したこと

・2つのストアドの実行時に、定義している一時テーブルのオブジェクトID・オブジェクト名を確認ところ参照してる一時テーブルは異なってることを確認した。

補足

一時テーブルの定義

-- 一時テーブルを定義 IF OBJECT_ID(N'tempdb..#wIo', N'U') IS NULL CREATE TABLE #wIo ( Deleted NUMERIC(1,0) DEFAULT ((0)), IoDocNo NUMERIC(22,0), IoRecNo NUMERIC(22,0), IoDate CHAR(10) COLLATE DATABASE_DEFAULT, IoType CHAR(2) COLLATE DATABASE_DEFAULT, ・ ・ ・ ); TRUNCATE TABLE #wIo;
-- 一時テーブルを定義 IF OBJECT_ID(N'tempdb..#wIo', N'U') IS NULL CREATE TABLE #wIo ( Deleted NUMERIC(1,0) DEFAULT ((0)), IoDocNo NUMERIC(22,0), IoRecNo NUMERIC(22,0), IoDate CHAR(10) COLLATE DATABASE_DEFAULT, IoType CHAR(2) COLLATE DATABASE_DEFAULT, ・ ・ ・ ); TRUNCATE TABLE #wIo;

※発生していることに記載している、「一方のストアドで共通の名前の一時テーブルをTRUNCATEした際に、以下のエラーが発生する。」は↑のTRUNCATE分ではありません。ストアドの中で別ストアドを呼び出し↑の一時テーブルをTRUNCATEしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2022/09/08 09:04

その一時テーブルの定義を質問に追記して下さい
KOZ6.0

2022/09/08 10:57

# を2つつけてグローバルな一時テーブルになっているのでは?
sazi

2022/09/08 14:47

成程。 では、実際に実行している内容が情報としてあった方が良いですね。
Y.ISHII

2022/09/08 23:07

一時テーブルの定義を追加いたしました。
KOZ6.0

2022/09/09 00:11

あー、これ Azure Synapse Analytics と Analytics Platform System (PDW) での話ですね。失礼しました。
Y.ISHII

2022/09/09 00:24

はい。単体では問題ないですが同時に実行されるとエラーが発生します。
KOZ6.0

2022/09/09 00:43

DELETE にすると問題ないでしょうか?
Y.ISHII

2022/09/09 01:57

DELETE でも同様です。 (仮にSELECTにしてみるとエラーは発生しませんでしたが一時テーブルの内容を更新するような操作はエラーになることを確認しました。(TRUNCATE,DELETE,INSERT))
KOZ6.0

2022/09/09 02:16

なにかおかしいですね。 存在チェックをやめて必ずテーブルを作成するようにしたらどうなります?
Y.ISHII

2022/09/09 02:21

存在チェックをコメントアウトして必ずテーブルを作成するようにして動作確認しましたが 同様のエラーとなりました。
KOZ6.0

2022/09/09 03:42

CREATE したストアドと TRUNCATE しているストアドが別ってことですか? 呼び出したストアドは一時テーブルがどのような構造をしているのかわかりません。 かなり変則的な使い方だと思います。 一時表はCREATE したストアドの中だけで使用し、DROP して抜けないと収集がつかなくなります。
Y.ISHII

2022/09/09 04:27 編集

はい、そうなのです。 ストアド①のパラメータによって呼び出すストアドを分けてるようなイメージで、その呼び出された先でストアド①でCREATEされた一時テーブルに対してデータを登録し、さらにその一時テーブルを使用しマスタ・トランテーブルなどへ登録するようなフローです。 「一時表はCREATE したストアドの中だけで使用し、DROP して抜けないと収集がつかなくなります。」 ↑この収集がつかないというのは、呼び出し先で意図した一時テーブルを参照できる保証がないということでしょうか?
Orlofsky

2022/09/09 06:26

質問は修正できます。 全角空白が入っていてエラーになりませんか? > IoDate □□CHAR(10) COLLATE DATABASE_DEFAULT, > IoType □□□CHAR(2) COLLATE DATABASE_DEFAULT,
Y.ISHII

2022/09/09 06:40

すみません。 質問にソース貼り付けたらインデントがずれたので全角空白入れて調節しました。 実際のソースには含まれていません。
KOZ6.0

2022/09/09 08:27

>↑この収集がつかないというのは、呼び出し先で意図した一時テーブルを参照できる保証がないということでしょうか? ストアドが増えていくと、どこでどのような一時テーブルを使っているか把握できなくなってしまい、ストアドから他のストアドを気軽に呼び出せなくなってしまう、ということです。 https://sql55.com/column/temporary-tables-with-same-name.php の後ろのほうに書かれていますが、別のストアドで同じ名前の一時表を作ってしまった場合、どちらが使われるかは保証されないようです。
guest

回答1

0

エラーの内容から見ると同じデータを参照しているように見えます。
別処理との事なので、一時テーブルの名前を別なものにしてみてください。

投稿2022/09/09 00:26

sazi

総合スコア25426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.ISHII

2022/09/09 00:35

2つのストアドの実行時に、定義している一時テーブルのオブジェクトID・オブジェクト名を確認したところ参照してる一時テーブルは異なってることを確認していますので同じデータを参照しているとは考えにくいです。 そこはどう考えられてますか? ※こちらの事情で申し訳ないですが、仕様上、一時テーブル名を変えることは最終手段としたいです。
sazi

2022/09/09 00:47 編集

別に作られている事は確認できても、エラーからは同じものを参照しているように見えるので、テスト的に別な名前で行ってみてください。 エラーが一時テーブル以外で発生している事も考えられますしね。
Y.ISHII

2022/09/09 02:13

回答ありがとうございます。 一時テーブル名をテスト的に変更して動作確認したところ、同様のエラーが発生いたしました。
sazi

2022/09/09 03:58

ではここまでですね。 質問の内容からは、詳細は分かりかねますので。
Y.ISHII

2022/09/09 04:05

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問