2016-08-22 7 views
0

У меня очень простой запрос, но я не могу заставить его работать. Пожалуйста, помогите. спасибоDynamic Pivot Sql Server

я следовал TUT, но мой запрос не работает

DECLARE @ColumnName NVARCHAR(MAX) = '' 
DECLARE @Query NVARCHAR(MAX) = '' 
DECLARE @Site NVARCHAR(MAX) = '' 
DECLARE @Date NVARCHAR(MAX) = '' 
DECLARE @MOnth NVARCHAR(MAX) = '' 


SELECT @ColumnName += QUOTENAME([Product Category]) + ',' 
FROM 
(
    SELECT DISTINCT [Product Category] 
    FROM vw_TTMTALK_BREAKDOWN_DETAIL_LINE 
    WHERE [Customer No] = 'SLPIP' AND 
    DATEPART(yyyy, [Posting Date])= '2016' AND 
    CONVERT(CHAR(3), [Posting Date], 0)= 'Jan' 
    GROUP BY [Customer No], [Product Category] 
) AS T1 

SET @ColumnName = LEFT(@ColumnName,LEN(@ColumnName)-1) 

set @Site = 'SLPIP' 
set @Date = '2016' 
set @Month = 'Jan' 

SET @Query = 'SELECT * FROM 
(
SELECT [Customer No], [Product Category] 
FROM vw_TTMTALK_BREAKDOWN_DETAIL_LINE 
WHERE [Customer No] = ' + @Site + ' AND 
DATEPART(yyyy, [Posting Date])=' + @Date + ' AND 
CONVERT(CHAR(3), [Posting Date], 0)=' + @Month + ' 
--GROUP BY [Customer No], [Product Category] 
) T2 
PIVOT (
    COUNT([Customer No]) 
    FOR [Product Category] IN (' + @ColumnName + ') 
) T3' 
--print @Query 
EXEC sp_executesql @Query 

Ошибка

Msg 207, Level 16, State 1, Line 5 
Invalid column name 'SLPIP'. 
Msg 207, Level 16, State 1, Line 7 
Invalid column name 'Jan'. 
+2

Отсутствие тиков вокруг @site в динамическом запросе. и около месяца. предполагая строковый тип данных для обоих. add char (39) до и после сайта. Пример: 'WHERE [Customer No] = '+ char (39) + @ Site + char (39)' AND' – xQbert

+0

Спасибо, сэр xQbert, что ваше решение работает –

ответ

2

Прежде всего, попробуйте как можно больше использовать параметризованные запросы и используйте конкатенацию строк только тогда, когда это абсолютно необходимо.

Так, фиксируя, что ваш запрос должен выглядеть как-то так:

DECLARE @ColumnName NVARCHAR(MAX) = ''; 
DECLARE @Query NVARCHAR(MAX) = ''; 
DECLARE @Site NVARCHAR(MAX) = ''; 
DECLARE @Date NVARCHAR(MAX) = ''; 
DECLARE @MOnth NVARCHAR(MAX) = ''; 

SELECT @ColumnName += ',' + QUOTENAME([Product Category]) 
FROM (
    SELECT DISTINCT [Product Category] 
    FROM vw_TTMTALK_BREAKDOWN_DETAIL_LINE 
    WHERE [Customer No] = 'SLPIP' 
     AND DATEPART(yyyy, [Posting Date]) = '2016' 
     AND CONVERT(CHAR(3), [Posting Date], 0) = 'Jan' 
    GROUP BY [Customer No], [Product Category] 
    ) AS T1; 

SET @Site = 'SLPIP'; 
SET @Date = '2016'; 
SET @Month = 'Jan'; 

SET @Query = ' 
    SELECT * 
    FROM (
     SELECT [Customer No], [Product Category] 
     FROM vw_TTMTALK_BREAKDOWN_DETAIL_LINE 
     WHERE [Customer No] = @Site 
      AND DATEPART(yyyy, [Posting Date]) = @Date 
      AND CONVERT(CHAR(3), [Posting Date], 0) = @Month 
     ) T2 
    PIVOT (
     COUNT([Customer No]) 
     FOR [Product Category] IN (' + STUFF(@ColumnName, 1, 1, '') + ') 
     ) T3'; 

EXEC sp_executesql @Query 
    , N'@Site NVARCHAR(MAX), @Date NVARCHAR(MAX), @Month NVARCHAR(MAX)' 
    , @Site 
    , @Date 
    , @Month; 

Я также призываю вас, чтобы исправить то, как вы запроса [Дата публикации]

Вместо этого:

AND DATEPART(yyyy, [Posting Date]) = '2016' 
AND CONVERT(CHAR(3), [Posting Date], 0) = 'Jan' 

Я бы переписать его так:

AND [Posting Date] >= '2016-01-01' 
AND [Posting Date] < '2016-02-01'; 

Это будет использовать индекс на [Posting Date], если таковой имеется.

+0

первое, что я запускаю, не работает, после 5 минут он работает , большое спасибо. Фактически я использую Year in query. Я неправильно использую переменную @ –

2

Вы должны использовать кавычки Arround SLPIP и Ян, когда вы строите свой запрос, поскольку эти значения string