Динамический круг - неправильная синтаксическая ошибка рядом с @cols
У меня есть представление в Sql Server называетсяITEMS_PRICE
". Некоторые из его столбцовName
"столбец и"FormulaResult_Cost
колонка.
То, что я пытаюсь сделать, это использовать динамический пивот, сделать все строкиName
'поле как столбцы и принять в качестве значения, значение'FormulaResult_Cost
".
Вот мой SQL-запрос:
DECLARE @query NVARCHAR(4000)
DECLARE @cols NVARCHAR(4000)
SELECT @cols = STUFF((SELECT distinct '' + QUOTENAME(p.Name)
from ITEMS_PRICE AS p
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,0,'')
--select STUFF(@cols, 1,0,'')
set @query = 'SELECT p.ItemCode, p.ItemName, p.ItmsGrpCod, p.ItmsGrpNam, p.Name, p.FormulaResult_Cost, ' + @cols + '
from
ITEMS_PRICE as p
pivot
(
max(p.FormulaResult_Cost)
for p.Name in (' + '[' @cols + ']' + ')
) AS t'
EXECUTE(@query)
Я получаю ошибку:
Сообщение 102, уровень 15, состояние 1, строка 29 Неверный синтаксис рядом с @cols.
Кроме того, я не хочу, чтобы динамический свод имел какие-либо агрегатные функции. Я просто прочитал на некоторых форумах, что вы должны использовать, по крайней мере, max()
функция для того, чтобы исправить for ... in
код.
2 ответа
Вы скучаете по +
до @cols
на этой линии: for p.Name in (' + '[' @cols + ']' + ')
должно быть for p.Name in (' + '[' + @cols + ']' + ')
,
Но я не верю, что вам нужны дополнительные квадратные скобки, так как QUOTENAME
Метод добавит их, поэтому он должен читать:
for p.Name in (' + @cols + ')
Кроме того, если вы делаете for p.Name in (@cols)
, ваш STUFF
функция должна возвращать значения через запятую, поэтому я бы обновил ваше объявление, добавив запятую после distinct
:
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.Name)
from ITEMS_PRICE AS p
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,0,'')
Полный запрос:
DECLARE @query NVARCHAR(4000)
DECLARE @cols NVARCHAR(4000)
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.Name)
from ITEMS_PRICE AS p
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,0,'')
--select STUFF(@cols, 1,0,'')
set @query = 'SELECT p.ItemCode, p.ItemName, p.ItmsGrpCod, p.ItmsGrpNam,
p.Name, p.FormulaResult_Cost, ' + @cols + '
from
ITEMS_PRICE as p
pivot
(
max(p.FormulaResult_Cost)
for p.Name in (' + @cols + ')
) AS t'
EXECUTE(@query)
Добавлять +
до @cols
, ('[' @cols + ']'
)
set @query = 'SELECT p.ItemCode, p.ItemName, p.ItmsGrpCod,
p.ItmsGrpNam, p.Name, p.FormulaResult_Cost, ' + @cols + '
FROM
ITEMS_PRICE as p
pivot
(
max(p.FormulaResult_Cost)
for p.Name in (''' + @cols + ''')
) AS t'