none
sp_executesql を使用したSQL文字列の中で、テーブル変数を使用するには? RRS feed

  • 質問

  • SQL Server 2005 SP1

     

    ストアドの中で、以下のように記述しているのですが、

    「テーブル変数 @worktable" を宣言してください。」というエラーになります。

    @worktableが、パラメータと見なされている為だと思うのですが、

    SQL文の中で、テーブル変数を使用するにはどうしたら、よいでしょうか。

     

    DECLARE
        @worktable table
        (
            AA varchar(3) not null
        )
    DECLARE @w_sql nvarchar(100)


       SET @w_sql = N'INSERT INTO @worktable( ・・・'
       EXECUTE sp_executesql @w_sql

    2007年11月20日 10:54

回答

  •  

    Jermainさん、いつも有難うございます。

     

    テーブル変数ではなく、ローカル一時テーブルを使用すればよいという事ですね。

    試してみて、OKでした。

    一時テーブルとテーブル変数の使い分けについては、ネットにもありますが、

    この場合などは、異なるのですね。

    本当に、感謝です。

    また、グローバル一時テーブルではなく、ローカル一時テーブルですので、複数ユーザーが

    同時に実行しても問題ないと思ってよろしいでしょうか。

     

    2007年11月21日 7:35
  •  fjdsskl2 さんからの引用

    また、グローバル一時テーブルではなく、ローカル一時テーブルですので、複数ユーザーが

    同時に実行しても問題ないと思ってよろしいでしょうか。

    問題ない = 他のユーザーからの参照や更新はされない、という意味でしたら、問題ありません。

    問題が解決してなによりです。回答済みをクリックしてスレッドを回答済みにしてくださいますようお願いします。

    2007年11月21日 18:56

すべての返信

  • コード ブロック

    /* テーブル変数を使う場合 */
    DECLARE @worktable table
    (AA varchar(3) not null)

     

    INSERT INTO @worktable VALUES('abc')
    SELECT * FROM @worktable

     

    /* 一時テーブルを使う場合 */
    CREATE TABLE #myTmpTbl
    (col1 varchar(3) not null)

     

    DECLARE @w_sql nvarchar(100)
       SET @w_sql = N'INSERT INTO #myTmpTbl VALUES(''def'')'
       EXECUTE sp_executesql @w_sql

     

    SELECT * FROM #myTmpTbl

     

     

    上記のスクリプトの動き、及びエラーメッセージから考えるに、sp_executesql はそのストアド プロシージャや T-SQL スクリプトとは別のスコープで実行されているようですね。

    2007年11月20日 14:47
  •  

    Jermainさん、いつも有難うございます。

     

    テーブル変数ではなく、ローカル一時テーブルを使用すればよいという事ですね。

    試してみて、OKでした。

    一時テーブルとテーブル変数の使い分けについては、ネットにもありますが、

    この場合などは、異なるのですね。

    本当に、感謝です。

    また、グローバル一時テーブルではなく、ローカル一時テーブルですので、複数ユーザーが

    同時に実行しても問題ないと思ってよろしいでしょうか。

     

    2007年11月21日 7:35
  •  fjdsskl2 さんからの引用

    また、グローバル一時テーブルではなく、ローカル一時テーブルですので、複数ユーザーが

    同時に実行しても問題ないと思ってよろしいでしょうか。

    問題ない = 他のユーザーからの参照や更新はされない、という意味でしたら、問題ありません。

    問題が解決してなによりです。回答済みをクリックしてスレッドを回答済みにしてくださいますようお願いします。

    2007年11月21日 18:56