Как вставить результат динамического вывода сводной таблицы во временную таблицу на сервере SQL? - PullRequest
0 голосов
/ 01 апреля 2019

Я перепробовал все ссылки ниже, но они не работают в моем сервере SQL?

SET @cols = STUFF((SELECT ',' + QUOTENAME(AD.MonthFormat) FROM #tempMonthFormat AD FOR xml PATH (''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
  SELECT @Selectcols =  STUFF((SELECT 
    ',' + ISNULL(@Selectcols + ',','')+ 'ISNULL(' + QUOTENAME(AD.MonthFormat) + ', 0) AS ' + QUOTENAME(AD.MonthFormat)  FROM #tempMonthFormat AD 
  FOR xml PATH (''), TYPE)
  .value('.', 'nvarchar(max)'), 1, 1, '');

Declare @FINALQUERY varchar(max);    
SET @FINALQUERY = '         
                      SELECT  Name,[Issue],' + @Selectcols + ' FROM
                     (
                         SELECT   into #temptable * FROM #Meantimeresult  
                     ) Y
                     PIVOT 
                     (
                         SUM(MT)
                         FOR [Monthformat] IN (' + @cols + ')               
                    ) p GROUP BY ' + @cols+',[Issue], Name'                

        EXEC SP_EXECUTESQL @FINALQUERY;

Результат динамического SQL INTO #Temp Table

Как создать временную таблицу из динамического запроса?

Вставить временную таблицу INTO из неизвестного числа и имени столбцов (из динамического запроса PIVOT) Результаты динамической сводки ввременная таблица

1 Ответ

0 голосов
/ 01 апреля 2019

Может быть сделано за пару шагов, но запутанный характер этого ответа должен указать вам, что вы сражаетесь здесь с сервером sql, а не с ним.Старайтесь изо всех сил найти другой способ структурировать свои отчеты так, чтобы в этом не было необходимости, прежде чем предпринимать такие радикальные меры, как эти.

1) Инкапсулируйте / взломайте свой первоначальный сводный запрос как хранимую процедуру без параметров.Если вам нужно передать какие-либо данные в процедуру, вы должны структурировать ее как глобальная временная таблица (## префиксная временная таблица), например,

CREATE PROCEDURE dynamic_meantime_pivot AS
DECLARE 
    @cols nvarchar(max) = STUFF(
        (SELECT ',' + QUOTENAME(AD.MonthFormat) FROM ##tempMonthFormat AD FOR xml PATH (''), TYPE)
        .value('.', 'nvarchar(max)'), 1, 1, '')
    @Selectcols nvarchar(max) = STUFF(
        (SELECT ',' + ISNULL(@Selectcols + ',','')+ 'ISNULL(' + QUOTENAME(AD.MonthFormat) + ', 0) AS ' + QUOTENAME(AD.MonthFormat)  FROM ##tempMonthFormat AD FOR xml PATH (''), TYPE)
        .value('.', 'nvarchar(max)'), 1, 1, '');

Declare @FINALQUERY varchar(max) = '         
                      SELECT  Name,[Issue],' + @Selectcols + ' FROM
                     (
                         SELECT * FROM ##Meantimeresult  
                     ) Y
                     PIVOT 
                     (
                         SUM(MT)
                         FOR [Monthformat] IN (' + @cols + ')               
                    ) p GROUP BY ' + @cols+',[Issue], Name'                

EXEC(@FINALQUERY)

2)Настройте все глобальные временные таблицы, требуемые описанной выше процедурой.

3) Вызовите процедуру с помощью функции OPENROWSET, как показано ниже:

SELECT * INTO #dynamic_meantime_table FROM OPENROWSET('SQLNCLI', 'Server=<your_sql_server_instance_name_here>;Trusted_Connection=yes;',
     'EXEC dynamic_meantime_pivot')

См. Также этот превосходный ответ относительно OPENROWSET.

Вставить результаты хранимой процедуры во временную таблицу

...