SQL Server 2000では、execを使用してテーブル変数に挿入できないのは本当ですか?
このスクリプトを試してみましたが、エラーメッセージEXECUTE cannot be used as a source when inserting into a table variable.
が表示されました
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 ...
の制限が解除されたため、それらの新しいバージョンには適用されません。
一時テーブルに切り替える必要があります。
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
ドキュメント から:
テーブル変数はローカル変数のように動作します。スコープは明確に定義されています。スコープは、宣言されている関数、ストアドプロシージャ、またはバッチです。
スコープ内では、テーブル変数は通常のテーブルのように使用できます。 SELECT、INSERT、UPDATE、およびDELETEステートメントでテーブルまたはテーブル式が使用される場所であればどこにでも適用できます。ただし、テーブルは次のステートメントでは使用できません。
INSERT INTO table_variable EXEC stored_procedure
SELECT select_list INTO table_variable statements.
ドキュメントは誤解を招くです。
本番環境で次のコードを実行しています
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
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
動的クエリが必要な場合