none
FROM句で変数を使用したい RRS feed

  • 質問

  • はじめまして。

    すごく単純な問題なのかもしれませんが、いくら探しても件名の問題の解決策が見つからなかったためここで質問させていただきました。

    CREATE PROCEDURE Test

    @a nvarchar(10)

    as

    set nocount on;

    select * from @a

    if @@ERROR!=0

    print 'Error'

    return(@@ERROR)

    のように、入力パラメータから動的にFrom句を変更したい場合どうしたらいいでしょうか?このままコンパイルすると「@aを宣言してください」というエラーが発生します。

    よろしくお願いします。

    2006年8月2日 6:53

すべての返信

  • #動的 SQL というキーワードで検索するとかなり出てくるかと思いますが。。。

    結論からいうと FROM に変数は使えません。
    では、どうするかというと動的に SQL を生成し、それを sp_executesql/exec で実行するというやり方になります。

    CREATE PROCEDURE Test(@a NVARCHAR(10))
    AS
    SET NOCOUNT ON

    DECLARE @sql NVARCHAR(128)  -- SQL 用変数、必要に応じてサイズを変更
    DECLARE @result INT                -- エラー値保持用変数
    -- 動的に SQL を生成
    SET @sql = N'SELECT * FROM ' + @a
    -- 動的に生成した SQL の実行
    -- WHERE 条件が無い場合は EXEC(@sql) でも可
    EXEC sp_executesql @sql
    -- @@ERROR の値を保持します
    SET @result = @@ERROR
    IF @result <> 0
        PRINT 'ERROR: ' + CONVERT(NVARCHAR(8), @result)
    -- 実行結果を返す
    -- ここで @@ERROR を返しても直前で実行された結果が入るため、@@ERROR の値は一時的に保持する必要がある
    RETURN @result

    2006年8月2日 7:11
  • おがわみつぎ さま

    ご返信ありがとうございます。

    質問の仕方が悪かったようです。FROM句を動的に変更する問題は要するに原因で、SQLの構文を動的に作成することが煩わしかったのでそれ以外の方法を探していました(様々なデータ型のパラメータがある場合構文用の文字列にcastするのがめんどくさかったので・・・)

    ですが、できないという回答をいただきスッキリしました。ありがとうございました。

    /*仰る通り「動的 SQL」でたくさんでてきました。失礼しました。*/

    2006年8月2日 7:30