【问题标题】:Insert dynamic query results into un-defined temp table?将动态查询结果插入未定义的临时表?
【发布时间】:2015-10-28 00:55:57
【问题描述】:

我正在定义一个长动态查询,我想将它的结果插入到一个表中。但是,我不想先定义表格。这可能吗?

查询正常运行,如果我运行它,我会看到预期的结果:

declare @query VARCHAR(MAX)
@query = 'SELECT
               --a bunch of stuff involving joins and pivots and such
         '
execute (@query)

但这些尝试选择未定义的临时表都不起作用:

--attempt 1
    declare @query VARCHAR(MAX)
    @query = 'SELECT * INTO #T1 (
                SELECT
                   --a bunch of stuff involving joins and pivots and such
                )
             '
    execute (@query)

--attempt 2
    declare @query VARCHAR(MAX)
    @query = 'SELECT
                   --a bunch of stuff involving joins and pivots and such
             '
    execute (@query)
    select * INTO #T1  execute (@query)

【问题讨论】:

  • 尝试 1 应该可以工作,但问题当然是执行结束时表将被删除 - 并且插入 ... 执行仅适用于已定义的表

标签: sql sql-server sql-server-2008


【解决方案1】:

一种解决方法是使用全局临时表:

SET @query = 'SELECT * INTO ##T1 FROM (
                SELECT
                   --a bunch of stuff involving joins and pivots and such
                )';

EXECUTE(@query);

SELECT *    -- reasign to local temp table to avoid reserving global ##T1 name
INTO #T1    -- if needed you can skip this part and work only on global table
FROM ##T1;

DROP TABLE ##T1;

SELECT *
FROM #T1;

LiveDemo

普通的本地临时表将不起作用,因为动态 SQL 会创建新的上下文。该表在该上下文中,并且在执行代码时将不复存在,因此您不能在 Dynamic-SQL 之外使用它。

【讨论】:

  • 请记住,全局临时表由所有会话共享,包括数据
猜你喜欢
  • 2015-11-12
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2019-12-22
  • 1970-01-01
相关资源
最近更新 更多