Obtention d'un tableau croisé dynamic généré dynamicment dans une table temporaire

J'ai vu cela , donc je sais comment créer un tableau croisé dynamic avec un set de champs générés dynamicment. Mon problème maintenant est que je voudrais get les résultats dans une table temporaire.

Je sais que pour get le résultat dans une table temporaire à partir d'une instruction EXEC , vous devez prédéfinir la table temporaire. Dans le cas d'un tableau croisé dynamic généré dynamicment, il n'y a aucun moyen de connaître les champs à l'avance.

La seule façon dont je peux penser à get ce type de fonctionnalité est de créer une table permanente en utilisant SQL dynamic. Y a-t-il un meilleur moyen?

vous pourriez faire ceci:

-- 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 ') 

EDIT: addded dynamic sql pour accepter les parameters de openquery

Laissez-moi essayer cette explication de select en lieu et place. Je cours également SQL Server 2005. Parce que vous avez des tables PIVOT, je vais supposer la même chose ou 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 

La seule différence entre un select normal et un select into est cette partie INTO #table.

  • pour la requête (select col1, col2, col3 du nom de table
  • col1 devient rowlabels
  • col2 devient columnheaders
  • col3 est l'set de données

  • se débarrasse également de la table globale

     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 

Ran dans ce numéro aujourd'hui, et posté sur mon blog . Brève description de la solution, est de créer une table temporaire avec une colonne, puis ALTER dynamicment en utilisant sp_executesql. Vous pouvez ensuite insert les résultats du PIVOT dynamic dans celui-ci. Exemple de travail ci-dessous.

 CREATE TABLE #Manufacturers ( ManufacturerID INT PRIMARY KEY, Name VARCHAR(128) ) INSERT INTO #Manufacturers (ManufacturerID, Name) VALUES (1,'Dell') INSERT INTO #Manufacturers (ManufacturerID, Name) VALUES (2,'Lenovo') INSERT INTO #Manufacturers (ManufacturerID, Name) VALUES (3,'HP') CREATE TABLE #Years (YearID INT, Description VARCHAR(128)) GO INSERT INTO #Years (YearID, Description) VALUES (1, '2014') INSERT INTO #Years (YearID, Description) VALUES (2, '2015') GO CREATE TABLE #Sales (ManufacturerID INT, YearID INT,Revenue MONEY) GO INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,2,59000000000) INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,2,46000000000) INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,2,111500000000) INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,1,55000000000) INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,1,42000000000) INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,1,101500000000) GO DECLARE @SQL AS NVARCHAR(MAX) DECLARE @PivotColumnName AS NVARCHAR(MAX) DECLARE @TempTableColumnName AS NVARCHAR(MAX) DECLARE @AlterTempTable AS NVARCHAR(MAX) --get delimited column names for various SQL statements below SELECT -- column names for pivot @PivotColumnName= ISNULL(@PivotColumnName + N',',N'') + QUOTENAME(CONVERT(NVARCHAR(10),YearID)), -- column names for insert into temp table @TempTableColumnName = ISNULL(@TempTableColumnName + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)), -- column names for alteration of temp table @AlterTempTable = ISNULL(@AlterTempTable + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)) + ' MONEY' FROM (SELECT DISTINCT [YearID] FROM #Sales) AS Sales CREATE TABLE #Pivot ( ManufacturerID INT ) -- Thats it! Because the following step will flesh it out. SET @SQL = 'ALTER TABLE #Pivot ADD ' + @AlterTempTable EXEC sp_executesql @SQL --execute the dynamic PIVOT query into the temp table SET @SQL = N' INSERT INTO #Pivot (ManufacturerID, ' + @TempTableColumnName + ') SELECT ManufacturerID, ' + @PivotColumnName + ' FROM #Sales S PIVOT(SUM(Revenue) FOR S.YearID IN (' + @PivotColumnName + ')) AS PivotTable' EXEC sp_executesql @SQL SELECT M.Name, P.* FROM #Manufacturers M INNER JOIN #Pivot P ON M.ManufacturerID = P.ManufacturerID