SQL dynamic SQL Server 2012 obtient le résultat dans une table #temp

J'utilise SQL Server 2012. J'aimerai get le résultat final de @sql dans une table temporaire. Voici mon code jusqu'à maintenant. Merci de votre aide.

IF OBJECT_ID ('tempdb.dbo.#MY_DT_CTE') IS NOT NULL DROP TABLE #MY_DT_CTE CREATE TABLE #MY_DT_CTE ([ROWID] INT NOT NULL IDENTITY (1,1) ,[YYYYMM] INT ) ; WITH MY_DT_CTE AS ( SELECT CONVERT(INT,CONVERT(VARCHAR(6),EOMONTH(GETDATE(),-1),112)) AS [YYYYMM] UNION SELECT CONVERT(INT,CONVERT(VARCHAR(6),EOMONTH(GETDATE(),-2),112)) AS [YYYYMM] UNION SELECT CONVERT(INT,CONVERT(VARCHAR(6),EOMONTH(GETDATE(),-3),112)) AS [YYYYMM] UNION SELECT CONVERT(INT,CONVERT(VARCHAR(6),EOMONTH(GETDATE(),-4),112)) AS [YYYYMM] UNION SELECT CONVERT(INT,CONVERT(VARCHAR(6),EOMONTH(GETDATE(),-5),112)) AS [YYYYMM] UNION SELECT CONVERT(INT,CONVERT(VARCHAR(6),EOMONTH(GETDATE(),-6),112)) AS [YYYYMM] ) INSERT INTO #MY_DT_CTE SELECT [YYYYMM] FROM MY_DT_CTE ORDER BY [YYYYMM] DESC; -- SELECT * FROM #MY_DT_CTE DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); SET @columns = N''; SELECT @columns += N', p.' + QUOTENAME(YYYYMM) FROM (SELECT p.YYYYMM FROM #MY_DT_CTE AS p GROUP BY p.YYYYMM) AS x; SET @sql = N' SELECT ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT p.YYYYMM FROM #MY_DT_CTE AS p ) AS j PIVOT ( COUNT(YYYYMM) FOR YYYYMM IN (' + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ') ) AS p;'; PRINT @sql; EXEC sp_executesql @sql; 

Besoin d'amener ce résultat @sql dans une table temporaire. 201605 201606 201607 201608 201609 201610

Un moyen facile serait d'utiliser une table temporaire globale. Cela peut être selected into la scope SQL dynamic pour avoir automatiquement le schéma désiré et être toujours disponible après que les sorties.

 SET @sql = N' SELECT ' + STUFF(@columns, 1, 2, '') + ' INTO ##GlobalTemp FROM ( SELECT p.YYYYMM FROM #MY_DT_CTE AS p ) AS j PIVOT ( COUNT(YYYYMM) FOR YYYYMM IN (' + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ') ) AS p;'; EXEC sp_executesql @sql; SELECT * FROM ##GlobalTemp 

Toutefois, cela peut entraîner des problèmes de dénomination des conflits si le code est exécuté simultanément.

Il est possible d'utiliser une table temporaire locale, mais le code est plus impliqué car il implique la création d'une table temporaire dans la scope supérieure, puis l'utilisation de SQL dynamic pour la modifier dans le schéma déterminé dynamicment avant de l'insert.

 CREATE TABLE #T ( Dummy INT ); SET @sql = 'ALTER TABLE #T ADD Dummy2 INT' + REPLACE(REPLACE(@columns, 'p.', ''), ']', '] int') + '; ALTER TABLE #T DROP COLUMN Dummy, Dummy2;' EXEC (@sql); SET @sql = N' INSERT INTO #T SELECT ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT p.YYYYMM FROM #MY_DT_CTE AS p ) AS j PIVOT ( COUNT(YYYYMM) FOR YYYYMM IN (' + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ') ) AS p;'; EXEC sp_executesql @sql; SELECT * FROM #T