プロが教えるわが家の防犯対策術!

SQL超初心者です。

ストアド内でテーブル名を可変にしたいのですが以下のようなエラーメッセージが表示され
でません。どなたか教えていただけませんか?

<エラーメッセージ>
テーブル変数 "@AA" を宣言してください。

◆環境
 sql Sever 2005

◆コードは以下の通りです。

DECLARE @AA VARCHAR(50)
DECLARE @HANTEI CHAR(5)
DECLARE @FETCHTABLE1 CHAR(22)
DECLARE @FETCHTABLE2 CHAR(22)

SET @HANTEI = 'ABCDEF'

SET @FETCHTABLE1 = 'DBO.USV_YOSAN'
SET @FETCHTABLE2 = 'DBO.USV_JISEKI'

BEGIN

IF @HANTEI = 'ABCEDF'
SET @AA= @FETCHTABLE2

SELECT * FROM @AA

PRINT @AA

END


以上 よろしくお願いいたします。

A 回答 (2件)

このSQLの目的がよくわからないですが、テーブル変数とは、ストアドの中でワークテーブルのように使う変数です。



#とか##がついた一時テーブルと似たようなものです。

おそらくやりたい事はこれでは無くて、SQL構文で実在のテーブルの名前だけを変えたいと言うことだと思います。

ならばSQLを文字列として作成しExecteで実行するなどのやり方か、sp_executesql を使うのがよいと思います。

この回答への補足

ご回答頂いた内容で解決すると思いますが、超初心者としては
あくまで単純にテーブルの名前だけをIF文で判定する値によって
変更したいのです。(何か違うことを言っているかもしれませんが?)

お願いします。

補足日時:2011/04/27 17:44
    • good
    • 0

>ご回答頂いた内容で解決すると思いますが、超初心者としては


>あくまで単純にテーブルの名前だけをIF文で判定する値によって
>変更したいのです。(何か違うことを言っているかもしれませんが?)

いや、初心者云々ではなく、Transact-SQLの仕様として、できる事とできない事がある以上、その方法に則って処理する以外にありません。

結論から言いますと、#1 さんの方法が正解です。

「SELECT * FROM @AA」と書いた時点で、(エラーのとおり)これは「テーブル変数」として判断されます。
このままの形では、質問者様のおやりになりたい事は残念ながらできません。

素直に、動的SQL(#1さんの回答)を使ってください。

例)
DECLARE @SQLSTR VARCHAR(100)
(中略)
IF @HANTEI = 'ABCEDF'
SET @AA=@FETCHTABLE2

--動的SQL文を生成
SET @SQLSTR = 'SELECT * FROM ' + @AA

--動的SQL実行
execute (@SQLSTR)

※手元にMSSQL無いので未検証です
    • good
    • 0
この回答へのお礼

何においても「できること」と「できないこと」がありますよね。
ご回答頂いた内容でトライしてみます。
ありがとうございました。

お礼日時:2011/04/28 08:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!