SQL Server 2000 での INSERT INTO @TABLE EXEC @query

SQL Server 2000では、execを使ってテーブル変数に挿入できないというのは本当ですか?

このスクリプトを試してみたところ、「テーブル変数に挿入する際、ソースとしてEXECUTEを使用することはできません」というエラーメッセージが表示されました。

declare @tmp TABLE (code varchar(50), mount money)
DECLARE @q nvarchar(4000)
SET @q = 'SELECT coa_code, amount FROM T_Ledger_detail'

INSERT INTO  @tmp (code, mount)
EXEC sp_executesql (@q)

SELECT * from @tmp

もしそうなら、どうすればいいですか?

ソリューション

N.B. - この質問と回答は、2000バージョンのSQL Serverに関するものです。それ以降のバージョンでは、「INSERT INTO @table_variable ... EXEC ...」の制限が解除されましたので、それ以降のバージョンには適用されません。EXEC ...`の制限が解除されたため、それ以降のバージョンには適用されません。


臨時テーブルに切り替える必要があります。

CREATE TABLE #tmp (code varchar(50), mount money)
DECLARE @q nvarchar(4000)
SET @q = 'SELECT coa_code, amount FROM T_Ledger_detail'

INSERT INTO  #tmp (code, mount)
EXEC sp_executesql (@q)

SELECT * from #tmp

ドキュメント](http://msdn.microsoft.com/en-us/library/aa260638(v=sql.80).aspx)より

テーブル変数は、ローカル変数のように動作します。宣言された関数、ストアドプロシージャ、またはバッチである、明確に定義されたスコープを持っています。

そのスコープ内では、テーブル変数は通常のテーブルのように使用できます。SELECT、INSERT、UPDATE、DELETEステートメントでテーブルやテーブル式が使用されている場所であればどこでも適用できます。ただし、以下の文ではテーブルを使用することはできません。

しかし、以下の文ではテーブルを使用することはできません: INSERT INTO table_variable EXEC stored_procedure.

SELECT SELECT_list INTO table_variable ステートメント。

解説 (6)

ドキュメントは誤解を招く恐れがあります。 本番環境で次のようなコードを実行しています。

DECLARE @table TABLE (UserID varchar(100))
DECLARE @sql varchar(1000)
SET @sql = 'spSelUserIDList'
/* Will also work
   SET @sql = 'SELECT UserID FROM UserTable'
*/

INSERT INTO @table
EXEC(@sql)

SELECT * FROM @table
解説 (0)
DECLARE @q nvarchar(4000)
SET @q = 'DECLARE @tmp TABLE (code VARCHAR(50), mount MONEY)
INSERT INTO @tmp
  (
    code,
    mount
  )
SELECT coa_code,
       amount
FROM   T_Ledger_detail

SELECT *
FROM   @tmp'

EXEC sp_executesql @q

動的なクエリで必要な場合

解説 (3)