2013-01-31 10 views
28

SQL Server 2000では、execを使用してテーブル変数に挿入できないのは本当ですか?SQL Server 2000でINSERT INTO @TABLE EXEC @query

私はこのスクリプトを試してみましたが、その真の場合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 

エラーメッセージが表示されました、私は何をすべきでしょうか?

+0

次のコード実行しています。 –

+0

「本当ですか? - [はい](http://msdn.microsoft.com/en-us/library/aa260638(v= sql.80).aspx) - "ただし、次のステートメントではテーブルを使用できません。INSERT INTO table_variable EXEC stored_procedure " –

+0

私はそれを得ました、それは@Anton Kovalenkoが言ったように、私はテーブル変数ではなく、一時テーブルを作成する必要があります... Thx。 :) – XMozart

答えて

53

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 

documentationから:

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

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

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO table_variable statements.

+1

@Damien、あなたの例では、Temp Tableを使用する理由はありませんが、あなたの例でもTable変数を使用できます。 – GoldBishop

+2

2008年に@tableVariablesを使用できることを確認しました+ – ohmusama

+2

@ohmusama - はい、質問には「2000」というタグが付いています。 –

5
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 

あなたは、動的クエリにしたい場合は

+0

はい、私は値が動的スクリプトからです..私はこれが動的ではないと思う.. – XMozart

+0

上記のクエリはあなたを助けるでしょう – brykneval

+0

これは静的な実行です。これを動的にするには、 '@ q'変数への代入内で連結を行う必要があります。ニースは試みますが、サイコロはありません。 – GoldBishop

9

ドキュメントは誤解を招くです。
私はそれが本当ならば、あなたは `(私はあなたがEXECから一時テーブルに挿入することができると確信してい)TEMPのTABLE`を作成する必要があり、生産

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 
関連する問題