我见过this,所以我知道如何使用动态生成的字段集创建数据透视表。我现在的问题是我想把结果放到临时表中。
我知道为了从 EXEC 语句将结果集放入临时表,您需要预定义临时表。对于动态生成的数据透视表,无法事先知道字段。
我能想到获得此类功能的唯一方法是使用动态SQL创建永久表。还有更好的方法吗?
答案 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)
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