将查询结果插入 temp table

Insert query results into temp table

我最近从这里学习了如何在 SQL 中执行 PIVOT,实际上我从这里的其他问题中举了一个例子。它完美运行。

但是,我想在查询之后执行额外的连接,但是我无法插入临时table查询的结果?我该怎么做?

创建table

CREATE TABLE yt
([Store] int, [Week] int, [xCount] int)
;
INSERT INTO yt
([Store], [Week], [xCount])
VALUES
(102, 1, 96),
(101, 1, 138),
(105, 1, 37),
(109, 1, 59),
(101, 2, 282),
(102, 2, 212),
(105, 2, 78),
(109, 2, 97),
(105, 3, 60),
(102, 3, 123),
(101, 3, 220),
(109, 3, 87);

执行旋转查询

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Week) 
                from yt
                group by Week
                order by Week
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')


set @query = 'SELECT store,' + @cols + ' from 
         (
            select store, week, xCount
            from yt
        ) x
        pivot 
        (
            sum(xCount)
            for week in (' + @cols + ')
        ) p '


execute(@query)

结果是

store   1   2   3
101 138 282 220
102 96  212 123
105 37  78  60
109 59  97  87

但我想将它放在#temp table 中,我尝试将 INTO #temp 放在 'Execute Query' 之前和 Query 中的 FROM 语句之前。

有什么想法吗?我知道 SELECT * INTO #temp FROM BlaBla 但它似乎与查询不同。

你在执行中遇到 select ... into #temp 的问题是 table 被创建了,但是由于在单独的范围内,它会在执行结束时立即被删除,所以你的程序看不到。

如果您在调用 execute 之前创建 table 并仅使用 insert into,您的代码将有效。您可以在 SQL Fiddle 中查看。这只会导致问题,如果您的查询是动态的,如何创建 table 以使其适合查询。

尝试创建逻辑以动态调整 SQL 中的列数并不容易,而且确实不是您应该做的事情。更好的方法是在您的表示层中处理它。

您可以动态创建全局临时文件table

  declare @tblName nvarchar(10)
  set @tblName = N'##Temp' + cast(@@spid as nvarchar(5))
  declare @tblCreate nvarchar(max)
  SET @tblCreate = N'create table ' + @tblName + ' (' 
  + REPLACE(@cols,',',' int,') + N' int)'

  EXECUTE sp_executesql @tblCreate

然后编辑您的@query 以插入到table。

set @query = 'INSERT INTO ' + @tblName + ' SELECT store,' + @cols + ' from 
         (
            select store, week, xCount
            from yt
        ) x
        pivot 
        (
            sum(xCount)
            for week in (' + @cols + ')
        ) p; 
        drop table ' + @tblName


execute(@query)

声明@cols 为 NVARCHAR(MAX), @query AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(周) 来自yt 按周分组 按周排序 FOR XML 路径(''),类型 ).value('.', 'NVARCHAR(MAX)') ,1,1,'')

set @query = 'SELECT store,' + @cols + ' 从##tempyt ( select 商店、周、xCount 来自yt ) X 枢 ( 总和(xCount) 在 (' + @cols + ') 中的一周 ) p'

如果存在则删除 TABLE ##tempyt;

执行(@query);

select * 来自 TempDB.sys.##tempyt