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

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

ただいまの
回答率

90.01%

SQLServer 動的SQLで一時表を作成したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,471

jawa

score 2960

~やりたいこと~
SQLServer2008R2を使用しています。
あるテーブルに一時表の作成クエリが格納されているカラムがあり、これまではAccessVBAでそのカラムから取得したSQLをもとに一時表を作成しておりました。

今回、上記AccessVBAとは別に、SQLServerのメンテナンスプランで実行するストアドを作成することとなりましたが、このストアド内で同様に一時表を作成したいと思っています。

~問題点~
現状、一時表の作成クエリの取得はできているのですが、これをストアド内で動的SQLとして実行しても続く処理で一時表が認識できないという点です。

DECLARE @WSQL     VARCHAR(4000)

--今回は固定のSQL文字列としていますが、本来はここで別テーブルからSQL取得しています。
SELECT @WSQL = 'CREATE TABLE #WK_TBL (COL1 VARCHAR (7) NULL ,COL2 INT NULL DEFAULT 0 )' 

EXEC (@WSQL)

INSERT INTO #WK_TBL (COL1,COL2) VALUES ('001',10) --ここでエラー発生。#WK_TBLがみつからない。

ちなみにEXECを使用せず、直接Create Tableを記述すれば問題なくINSERTできました。
また#をつけず、通常表として作成・INSERTした場合にはEXECでも問題なく処理できました。

いろいろ調べてみたところ、EXECでSQL実行した場合は別セッションとして処理されているのでは?という文献を見かけました。
たしかに別セッションと考えれば納得いく動作なのですが、だとしたらどうすればいいのか、やはり無理なのか、よい対応方法をご存知の方がいればご教授いただきたいです。

この#WK_TBLはこのストアドが呼び出す次処理のストアド内でも参照され、また他の既存機能からも利用されているため、できればテーブル作成も埋め込みではなくカラムから取得したCreate文で実行したいです。
アドバイスのほどよろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

いろいろ調べてみたところ、EXECでSQL実行した場合は別セッションとして処理されているのでは?という文献を見かけました。

私は、以下のリンクを参考に動的テーブルを作成しました。
動的SQL

この#WK_TBLはこのストアドが呼び出す次処理のストアド内でも参照され、また他の既存機能からも利用されているため

ローカル一時テーブルを指定していますが、排他制御?等 扱いたいのであれば グローバル一時テーブルを検討してみては。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 15:51

    ご回答ありがとうございます。
    そして説明が足りていなかったようで申し訳ありません。

    #WK_TBLは既存の他システムでも利用されているテーブルのため、今回改修にあたり手を加えたくないという事情があります。
    (質問文中に記載しました「次処理のストアド」というのも#WK_TBLを利用している既存システムのひとつです。)
    グルーバル一時テーブルに変更するとなると、それら既存システムの改修も必要になってしまいますので避けたいところです。

    ご紹介いただきましたページにつきましては、一時テーブルと呼称していますがローカル一時テーブルやグローバル一時テーブルではない通常のテーブルを使い終わった時に自分でDROPしているものです。
    これも上記と同様の理由により今回は避けたいと思っております。

    やはり動的SQLで一時表を作成するのは難しいのでしょうか。

    キャンセル

  • 2016/02/12 16:25

    連結してみては?

    -- 今回は固定のSQL文字列としていますが、本来はここで別テーブルからSQL取得しています。
    SELECT @WSQL = 'CREATE TABLE #WK_TBL (COL1 VARCHAR (7) NULL ,COL2 INT NULL DEFAULT 0 )'

    -- EXEC (@WSQL) コメント
    Select @WSQL= @WSQL + ';'

    @WSQL = @WSQL + INSERT INTO #WK_TBL (COL1,COL2) VALUES ('001',10)

    EXEC (@WSQL)

    キャンセル

  • 2016/02/12 18:29

    たびたびのご回答ありがとうございます。

    SQLを連結してExecというと全体のSQLが長くなる場合は厳しくなるかもしれませんが、今回最終的に作成したいものは上記のような一時テーブルの作成が2つと、後続のストアド実行が1つですので充分使えそうです。

    参考にさせていただきます。

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる