2013-01-31 102 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