使用 SQL Server 2000 插入 @TABLE EXEC @query

Posted

技术标签:

【中文标题】使用 SQL Server 2000 插入 @TABLE EXEC @query【英文标题】:INSERT INTO @TABLE EXEC @query with SQL Server 2000 【发布时间】:2013-01-15 09:16:42 【问题描述】:

是不是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

如果是这样,我该怎么办?

【问题讨论】:

如果是真的,你应该CREATE TEMP TABLE(我相信你可以从EXEC插入临时表)。 “这是真的吗?” - yes - "但是,表不能用于以下语句:INSERT INTO table_variable EXEC stored_procedure" 好的,我明白了,就像@Anton Kovalenko 说的,我需要创建临时表,而不是表变量...谢谢。 :) 【参考方案1】:

注意 - 这个问题和答案与 SQL Server 2000 版本有关。在以后的版本中,对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 语句中使用表或表表达式的任何地方。但是,table 不能用在以下语句中:

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO table_variable statements.

【讨论】:

@Damien,在您的示例中,没有理由使用临时表,即使在您的示例中,您仍然可以使用 Table 变量。 2008+年验证可以使用@tableVariables @ohmusama - 是的,但这个问题被标记为2000,我已经链接到 2000 文档,说它不可用。 @Damien_The_Unbeliever,我知道,但由于谷歌无法弄清楚,(当我从那里来到这里时),这是对像我这样的其他人的评论。 @ohmusama - 好的,我在顶部添加了一条注释以(尝试)清楚地表明这个问题和答案只与 2000 版本的产品有关。【参考方案2】:

文档具有误导性。 我在生产中运行以下代码

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

【讨论】:

【参考方案3】:
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

如果你想动态查询

【讨论】:

是的,我希望这些值来自动态脚本..我认为这不是动态的.. 所以上面的查询会对你有所帮助 是的,这是一个静态执行。为了使它成为动态的,您需要在@q 变量的赋值中进行连接。不错的尝试,但没有骰子。

以上是关于使用 SQL Server 2000 插入 @TABLE EXEC @query的主要内容,如果未能解决你的问题,请参考以下文章

在sql server中一次插入固定数量的行2000

SQL server TVP批量插入超过2000个参数

请教,SQL SERVER 2000使用insert插入一条记录,最快耗时多少

批量插入、SQL Server 2000、unix 换行符

Access 2000 连接到 SQL Server 2005

SQL Server 2000中如何设置自增主键?