Я пытаюсь создать временную таблицу с динамическим количеством столбцов на основе количества строк из другой временной таблицы. Скажем, у меня есть 89 строк в #table1, в #table2 я хотел бы использовать количество строк и взять соответствующее значение строки в качестве имени столбца. Я возился с этим некоторое время, но я продолжаю получать ошибки. Вот мой запрос, который позже будет преобразован в процедуру.
Моя таблица выглядит следующим образом (все столбцы представляют собой varchar с нулевым значением, если импортированная дата не имеет данных для этого номера CVE — CVEId относится к CVEID ограничения FK в таблице CVENumber):
CVEId D20160901 D20160902 D20160903 D20160904 D20160905
1 6182 6473 5879 NULL NULL
2 72862 76583 NULL NULL 74772
CVENumber Table:
CVEID CVENumber
1 CVE-781-2016
2 CVE-006-2016
Я надеюсь получить дату столбца или, возможно, использовать введенную дату в качестве первой строки - запустить запрос к этим данным, где я могу указать 01-09-2016 TO 03-09-2016. И вернуть все строки из таблицы с номером CVENumber, указанным в таблице CVENumber. Как я хочу, чтобы мой результат выглядел так:
CVE Number 09-01-2016 09-02-2016 09-03-2016
CVE-781-2016 6182 6473 8579
CVE-006-2016 72682 76583 0
Я надеюсь, что это проясняет, что я пытаюсь сделать.
Мой текущий запрос с использованием STUFF(), который берет строки из #FixedDates и превращает их в столбцы. Я хочу, чтобы эти столбцы, возвращенные в @cols, были добавлены в качестве столбцов в #query_results.
Set nocount on
Insert #tmp
EXEC sp_columns @table_name = N'CVECountsByDate'
-- Using collate to force the DB to only look at Uppercase values
DECLARE @cols varchar(max), @query varchar(max), @cols2 varchar(MAX)
INSERT #FixedDays
SELECT Replace(COLUMN_NAME, 'D' collate Latin1_General_CS_AS, '' collate Latin1_General_CS_AS) from #Tmp
WHERE COLUMN_NAME LIKE 'D%' collate Latin1_General_CS_AS OR COLUMN_NAME = 'CVEId' ORDER BY COLUMN_NAME DESC
SET @cols = STUFF((SELECT ',' + QUOTENAME(QT.COLUMN_NAME) + ' varchar(100)'
FROM #FixedDays QT
GROUP BY QT.COLUMN_NAME
ORDER BY QT.COLUMN_NAME
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1,1,'')
SET @cols2 = N'CREATE TABLE #query_results (' + @cols + ') '
--EXEC(@cols2)
SELECT @cols2
DROP TABLE #FixedDays
DROP TABLE #Tmp