投稿

6月, 2026の投稿を表示しています

SqlCommandの一時テーブルとパラメーターの落とし穴

イメージ
  .NETのSqlCommandでローカル一時テーブルを作成する際、SQLにSqlParameterを含めると、直後のSqlCommandからその一時テーブルを参照できず、「オブジェクト名 '#temp' が無効です」というエラーが発生することがあります。 using SqlCommand comm1 = conn.CreateCommand(); comm1.CommandText = """ CREATE TABLE #temp (col INT NOT NULL); INSERT INTO #temp (col) VALUES (@param); """; SqlParameter param = comm1.CreateParameter(); param.ParameterName = "@param"; param.Value = 1; comm1.Parameters.Add(param); await comm1.ExecuteNonQueryAsync(); using SqlCommand comm2 = conn.CreateCommand(); comm2.CommandText = "SELECT col FROM #temp;"; // Microsoft.Data.SqlClient.SqlException: // オブジェクト名 '#temp' が無効です。 var value = await comm2.ExecuteScalarAsync(); 原因は、パラメーター化されたSQLがSQL Server側でsp_executesqlとして実行されるためです。sp_executesql内で作成されたローカル一時テーブルは、その実行スコープ内のものとして扱われ、スコープ終了時に破棄されます。そのため、次のSqlCommandからは参照できません。 対策としては、まずパラメーターを使わずにローカル一時テーブルの作成のみを実行し、その後パラメーター化されたSQLでデータを操作します。あるいは、作成から利用までをすべて1つのSqlCommand内で完結させる方法もあります。 ローカル一時テーブルを...

記念切手

イメージ
 先日、郵送用の切手を購入しに郵便局へ行ってきました。 今回選んだのは「ハッピーグリーティング」シリーズ。 風船をモチーフに、いぬ・ちょう・くまなどの動物たちがシンプルなタッチで表現されたデザインです。 シンプルながらも温かみがあって、思わず手に取りたくなる可愛らしさ。 受け取った方にも、封筒を開ける前からちょっと嬉しい気持ちになってもらえそうだな、と感じました。 郵便局の切手はシリーズごとにさまざまなテーマで展開されていて、毎回どんなデザインが出るのか楽しみのひとつです。 普段は機能重視で選びがちな切手ですが、こういう遊び心のあるデザインも取り入れながら、受け取る方への小さな気配りにしていきたいと思います。