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

Я пытаюсь создать новую таблицу из результатов динамического центра ниже. Сам запрос работает нормально.

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME)
FROM (SELECT p.COMMON_NAME FROM eBird AS p
GROUP BY p.COMMON_NAME) AS x;
SET @sql = N'
SELECT SAMP_EVENT_ID, ' + STUFF(@columns, 1, 2, '') + '
FROM
(SELECT SAMP_EVENT_ID, COMMON_NAME, SUM(IIF(OBS_COUNT IS NULL, 0, 1)) AS       
Pres
FROM eBird GROUP BY SAMP_EVENT_ID, COMMON_NAME) AS j
PIVOT
(SUM(Pres) FOR COMMON_NAME IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')  + ')) AS p;';
PRINT @sql;
EXEC sp_executesql @sql; 

Я попробовал типичный
SELECT * INTO newtable FROM (подзапрос) Но это не сработало. Я получаю сообщения об ошибках: "Сообщение 156, уровень 15, состояние 1, строка 416, неправильный синтаксис рядом с ключевым словом" DECLARE ". Сообщение 102, уровень 15, состояние 1, строка 432, неправильный синтаксис рядом с") "."

Я также попытался изменить этот раздел следующим образом: SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME) INTO sp_pivot FROM(ВЫБЕРИТЕ p.COMMON_NAME FROM eBird AS p GROUP BY p.COMMON_NAME) AS x;

Но я получаю эту ошибку:
Сообщение 194, уровень 15, состояние 1, строка 419 Инструкция SELECT INTO не может содержать инструкцию SELECT, которая присваивает значения переменной.

Я потратил довольно много времени, пытаясь понять это, взглянув на предыдущие вопросы, и был бы признателен за любую помощь. Спасибо.

1 ответ

Ниже работает на MS SQL 2014.

 DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME)
FROM (SELECT p.COMMON_NAME FROM eBird AS p
GROUP BY p.COMMON_NAME) AS x;
SET @sql = N'
SELECT SAMP_EVENT_ID, ' + STUFF(@columns, 1, 2, '') + ' into NewTable
FROM
(SELECT SAMP_EVENT_ID, COMMON_NAME, SUM(IIF(OBS_COUNT IS NULL, 0, 1)) AS       
Pres
FROM eBird GROUP BY SAMP_EVENT_ID, COMMON_NAME) AS j
PIVOT
(SUM(Pres) FOR COMMON_NAME IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')  + ')) AS p;';
PRINT @sql;
EXEC sp_executesql @sql; 

Версия от 2008 R2, которая работает:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME)
FROM (SELECT p.COMMON_NAME FROM eBird AS p
GROUP BY p.COMMON_NAME) AS x;
SET @sql = N'
SELECT SAMP_EVENT_ID, ' + STUFF(@columns, 1, 2, '') + '  into NewTable2 
FROM
(SELECT SAMP_EVENT_ID, COMMON_NAME, SUM(case when OBS_COUNT is null then  0 else 1 end) AS       
Pres
FROM eBird GROUP BY SAMP_EVENT_ID, COMMON_NAME) AS j
PIVOT
(SUM(Pres) FOR COMMON_NAME IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')  + ')) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;  
Другие вопросы по тегам