読者です 読者をやめる 読者になる 読者になる

checkpoint

自分用のIT技術系ノートです。古い情報や間違っている情報もあるので注意。

ADO(.NET) + SQL Serverでパラメータークエリを使った場合、ローカル一時テーブルが作成出来ない

最近職場の人が言っていた件。自分も前にこれでかなり悩んだものです。


PRB: ADO のパラメーター化されたクエリを使用すると SQL Server のローカル一時テーブルが作成されません。


ADO.NET 1.1 でも再現するこの現象。例えば以下のようなパラメータークエリで起こります。

--SQLその1(ローカル一時テーブル作成)
SELECT
  hoge_id
  , hoge_val
INTO
  #hoge_temp
FROM
  hoge_table
WHERE
  hoge_id = @HOGEID


--SQLその2(ローカル一時テーブルをSELECT)
SELECT
  *
FROM
  #hoge_temp

この場合、SQLその2で以下のようなエラーとなります。

エラー-2147217865"無効なオブジェクト名 '#hoge_temp'

これではTransact-SQL必殺のSELECT INTO句を使えません。
マイクロソフトの見解としては「これは仕様によるものです」とのことですので、あきらめて以下のようにしましょう。

--SQLその1-1(ローカル一時テーブル作成 CREATE文使用)
CREATE TABLE
  #hoge_temp
  (hoge_id int
  , hoge_val nvarchar(64))


--SQLその1-2(ローカル一時テーブル作成 SELECT INTO アドホッククエリ)
--CREATE文でフィールドの型やデータ長を書きたくない場合に
SELECT TOP 0
  hoge_id
  , hoge_val
INTO
  #hoge_temp
FROM
  hoge_table WITH(NOLOCK)
--↑TOP 0でも場合によってはロックの影響を受けるのでNOLOCK


--SQLその2(ローカル一時テーブルにデータ書き込み パラメータークエリ)
INSERT INTO
  #hoge_temp
SELECT
  hoge_id
  , hoge_val
FROM
  hoge_table
WHERE
  hoge_id = @HOGEID
 

--SQLその3(ローカル一時テーブルをSELECT)