2013-01-31 89 views
28

是不是真的SQL Server 2000,你不能使用exec插入到表變量?INSERT INTO @TABLE EXEC @query與SQL Server 2000

我想這個腳本,並得到一個錯誤信息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

如果這是真的,你應該'創建臨時TABLE'運行下面的代碼(我敢肯定,你可以從EXEC插入到一個臨時表)。 –

+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

注: - 這個問題和答案涉及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」,並且我已鏈接到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

文檔是誤導性的。
我在生產

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