【问题标题】:INSERT INTO @TABLE EXEC @query with SQL Server 2000使用 SQL Server 2000 插入 @TABLE EXEC @query
【发布时间】: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 说的,我需要创建临时表,而不是表变量...谢谢。 :)

标签: sql-server tsql sql-server-2000


【解决方案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 变量的赋值中进行连接。不错的尝试,但没有骰子。
    猜你喜欢
    • 2012-08-15
    • 2017-12-02
    • 2011-06-18
    • 1970-01-01
    • 2022-08-24
    • 2010-10-03
    • 2011-07-19
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多