C# 一時ファイルが無効になる

タグの編集
投稿者 ケンケン  (社会人) 投稿日時 2023/11/7 10:03:25
#C
 dbは、SqlServer 2019 です。
  select 
    N_Tcd
  ,sum(N_Uriage   ) as uriage
 ,sum(N_Syouhizei) as syouhizei
    INTO #tmp01
  from hanbai.dbo.T_Huriage 
   以下省略
上記でselect into にて一時ファイルを作成しましたが、
   update hanbai.dbo.T_tokui
      set
        N_Zenkaizan = 0 
        以下省略
 上記をを実行すると落ちました。

 エラー内容です。 
 System.Data.SqlClient.SqlException (0x80131904): オブジェクト名 '#tmp01' が無効です。

 何方かご存知方御教授お願いします。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/11/7 13:53:27
SQL Server においては
『# で始まるテーブル名』は、自ユーザーのみが使用可能な「ローカル一時テーブル」
『## で始まるテーブル名』は、全ユーザーが使用可能な「グローバル一時テーブル」
ですよね。

両者は同一のセッションになっていますか?

Connection が別の場合、
第一接続で生成されたローカル一時テーブル #tmp01 を
第二接続で利用するといったことはできません。
投稿者 C# 一時ファイルが無効になる  (社会人) 投稿日時 2023/11/7 14:10:58
回答ありがとうございます。
#ローカルの問題でした。
##グローバルに変更後は問題なく動作しました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/11/7 14:35:07
作業領域的な利用であれば、通常はローカル一時テーブルを用いると思いますよ。

グローバルの場合、作成されるとすべてのユーザーに表示され、別セッションからも参照できます。
(このテーブルを参照するすべてのユーザーが SQL Server のインスタンスから切断すると削除されます)
より具体的に言えば、グローバル一時テーブルを作成したセッションが終了して、そのグローバル一時テーブルを参照していた最後の Transact-SQL ステートメントの完了時に削除されるということです。

ローカル一時テーブルを利用した SQL のサンプルを紹介しておきます。
https://stackoverflow.com/questions/37954565/creating-and-populating-temp-table-in-different-commands