将动态生成的数据透视表转换为临时表

时间:2009-04-22 16:20:03

标签: sql sql-server database pivot

我见过this,所以我知道如何使用动态生成的字段集创建数据透视表。我现在的问题是我想把结果放到临时表中。

我知道为了从 EXEC 语句将结果集放入临时表,您需要预定义临时表。对于动态生成的数据透视表,无法事先知道字段。

我能想到获得此类功能的唯一方法是使用动态SQL创建永久表。还有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

今天进入这个问题,发布在blog上。解决方案的简短描述,是创建一个包含一列的临时表,然后使用sp_executesql动态更改它。然后,您可以将动态PIVOT的结果插入其中。下面的工作示例。

array = test(array);

答案 1 :(得分:1)

你可以这样做:

-- add 'loopback' linkedserver 
if exists (select * from master..sysservers where srvname = 'loopback')
    exec sp_dropserver 'loopback'
go
exec sp_addlinkedserver @server = N'loopback',
    @srvproduct = N'',
    @provider = N'SQLOLEDB', 
    @datasrc = @@servername
go

declare @myDynamicSQL varchar(max)
select @myDynamicSQL = 'exec sp_who'
exec('
    select * into #t from openquery(loopback, ''' + @myDynamicSQL + ''');
    select * from #t
    ')

编辑:添加动态sql以接受params到openquery

答案 2 :(得分:1)

让我试试一下select into的解释。我也在运行SQL Server 2005。因为你有PIVOT表,我将假设相同或2008年。

select 
    o.*,
    OtherField1,
    OtherField2
INTO #temp
FROM
    OriginalOtherData as ood
PIVOT (
    MAX([Value])
    FOR Field in (OtherField1, OtherField2)
) as piv
RIGHT OUTER join
    Original o on o.OriginalSD = piv.OriginalSD

select * from #temp
Drop table #temp

普通选择和选择输入之间的区别在于INTO #table部分。

答案 3 :(得分:0)

  • 用于查询(从tablename
  • 中选择col1,col2,col3
  • col1变为rowlabels
  • col2成为列标题
  • col3是数据集

  • 也摆脱了全局表

    if OBJECT_ID('tempdb..#3') is not null drop table #3
    if OBJECT_ID('tempdb..##3') is not null drop table ##3
    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(   col2    ) from    tablename    FOR XML PATH(''), col2).value('.', 'NVARCHAR(MAX)'),1,1,'')
    set @query = 'SELECT col1, ' + @cols + ' into ##3 from ( select col1, col2, col3 from tablename ) x  pivot (  max(col3)for col2 in (' + @cols + ')) p '
    execute(@query)   
    select * into #3 from ##3 if OBJECT_ID('tempdb..##3') -- is not null drop table ##3