将查询结果插入临时表

时间:2015-08-19 14:39:05

标签: sql sql-server pivot

我最近从这里学到了如何在SQL中进行PIVOT,我实际上从这里的另一个问题中得到了一个例子。它运作得很好。

但是,我想在查询后执行其他连接,但是我无法将查询结果插入临时表中?我怎么能这样做?

创建表

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表中使用它,并且我尝试在“执行查询”之前和查询中的FROM语句之前放置INTO #temp。

有什么想法吗?我知道SELECT * INTO #temp FROM BlaBla,但看起来与查询有差异。

2 个答案:

答案 0 :(得分:0)

您在执行中遇到select ... into #temp的问题是表被创建,但由于处于单独的范围内,它会在执行结束时立即被删除,因此您的程序可以&#39看到了。

如果在调用execute之前创建表并且只使用insert into,那么您的代码将起作用。您可以在SQL Fiddle中查看此内容。这只会导致问题,如果您的查询是动态的,如何创建表以使其适合查询。

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

答案 1 :(得分:0)

您可以动态创建全局临时表

  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以插入表格。

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)