【问题标题】:dynamically creating the #temp table and then used to insert the data动态创建#temp表,然后用于插入数据
【发布时间】:2013-08-03 04:55:09
【问题描述】:

我正在将查询的中间结果导入临时表以供进一步使用,因此我使用#temp 表来维护与

相同的架构
select * into # temp from schema.tableName where 1<>1;

insert into # temp from exec(table)

虽然我将此语句作为变量传递不同的 tableName 它不起作用

SET @TEMPSCHEMA = 'SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'

exec(@TEMPSCHEMA)


INSERT INTO #temp

EXEC ( @SELECTSTATEMENT

)

但是在 exec 语句之后,它不会将值带到临时表中。

它显示了无效的对象 ID #temp

【问题讨论】:

  • 如果你运行@selectstatement 会返回行吗?

标签: sql sql-server-2008


【解决方案1】:

这是因为EXEC 语句的范围与包含的存储过程的范围不同。也就是说,您对EXEC 的调用正在创建临时表,然后随着EXEC 的范围离开,它会被自动删除。您基本上必须在 one EXEC 声明中完成所有工作:

DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * INTO #temp
            FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1
            INSERT INTO #temp ...'

EXEC(@sql)

【讨论】:

    【解决方案2】:

    一旦动态 SQL 完成执行,本地临时表就会超出范围。

    你必须这样做:

    -- everything w/ dynamic sql
    SET @TEMPSCHEMA = '
      SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;
      INSERT INTO #temp EXEC (@SELECTSTATEMENT)
      SELECT .... -- whatever else you need to do
      '
    
    exec sp_executesql @TEMPSCHEMA, N'@SELECTSTATEMENT NVARCHAR(MAX)', @SELECTSTATEMENT
    

    -- global temp table rather than local
    SET @TEMPSCHEMA = 'SELECT * INTO ##temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'
    exec(@TEMPSCHEMA)
    
    INSERT INTO ##temp EXEC (@SELECTSTATEMENT)
    

    【讨论】:

    • 感谢大家,我使用了 gobal temp table 解决了我的问题。很高兴向大家学习谢谢 prav
    • 记住全局临时表可以被其他用户在其他会话中访问。您最终可能会导致两个用户做同样的事情并相互影响。
    【解决方案3】:

    我正在将查询的中间结果导入临时表以供进一步使用

    那部分几乎总是一个错误。你能分享一下你计划在接下来的一两个步骤中做什么吗?奇怪的是,我们可以将其重写为所有发生在同一个语句中。

    【讨论】:

      【解决方案4】:

      不支持运行必须使用 into 语句将数据插入临时表的动态语句。之前创建了临时表,然后使用动态查询插入到临时表中就可以了。原因是当使用 exec() 语句时在子上下文中运行,一旦上下文关闭,动态临时表也会丢失。

      【讨论】:

        【解决方案5】:

        exec(@TEMPSCHEMA) 是否会在与您的过程不同的上下文中运行,因此一旦 exec 完成,#temp 就会不复存在?

        啊,是的,here it is

        • 在存储过程或触发器中,所有包含临时表名称的语句都必须引用在同一存储过程中创建的临时表。临时表不能在调用或调用的存储过程中创建,也不能在使用 EXECUTE 或 sp_executesql 执行的字符串中创建。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 2015-12-10
          • 2018-06-04
          • 1970-01-01
          • 1970-01-01
          • 2016-12-23
          相关资源
          最近更新 更多