Динамический круг - неправильная синтаксическая ошибка рядом с @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'
Другие вопросы по тегам