2015-09-02 5 views
1

У меня есть динамический SQL-запрос, как показано ниже.T sql CONCAT по запятой динамический запрос

DECLARE @cols AS NVARCHAR(MAX) = '[0],[3],[11]', 
     @query AS NVARCHAR(MAX) 

SET @query = N'SELECT * FROM 
       (
        SELECT 
        year(createdDate) as [year],month(createdDate) as [month],cp.product_Id as product_ID,cp.salesprice as Amount 
        FROM customer_products cp    
       )s 
       PIVOT 
       (
       SUM(Amount) 
       FOR product_Id IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 

Вопрос:

выше запрос работает, однако, ниже запроса не работает из-за

SELECT @cols = CONCAT(@cols, '[', cast(product_ID as varchar),']') FROM Product 

код block.Error отображает Неправильный синтаксис около

DECLARE @cols AS NVARCHAR(MAX) = '', 
     @query AS NVARCHAR(MAX) 

SELECT @cols = CONCAT(@cols, '[', cast(product_ID as varchar),'],') FROM Product 

    SET @query = N'SELECT * FROM 
        (
         SELECT 
         year(createdDate) as [year],month(createdDate) as [month],cp.product_Id as product_ID,cp.salesprice as Amount 
         FROM customer_products cp    
        )s 
        PIVOT 
        (
        SUM(Amount) 
        FOR product_Id IN ('+ @cols +')) 
    AS pvt;' 

    EXECUTE(@query) 

Где я пропущу то, чего не хватает в вышеуказанном запросе при выборе productID из продукта?

+0

Я думаю, вам нужно удалить последний '' из @cols – lad2025

+0

выше запроса в [0], [3], [11], поэтому я добавил, как я могу разрешите, если вы скажете, что я должен удалить спасибо –

+0

Используйте 'SET @cols = LEFT (@cols, LEN (@cols) - 1)' после конкатенации и перед определением @query. И посмотрите [мой ответ] (http://stackoverflow.com/questions/32294417/tsql-pivoting-issue-looking-for-better-approach/32295875#32295875) для демонстрации примера – lad2025

ответ

2

Вы должны удалить последнюю , из @cols, добавьте

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

Вы можете рассмотреть возможность использования XML вместо CONCAT как:

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(CAST(product_ID as VARCHAR(10))) 
         FROM Products 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
        , 1, 1, ''); 

Это хорошая практика, чтобы определить длину для cast(product_ID as varchar(10))

+0

FYI, если вы не определили длину 'varchar' в' CAST' или 'CONVERT', длина по умолчанию будет 30 символов. Если вы не определили длину 'varchar' в объявлении переменной, длина по умолчанию будет всего 1 символ. – Kaf

+0

@Kaf Полезно знать, спасибо за разъяснения – lad2025

1

Необходимо, чтобы последняя запятая была удалена из списка выбора, или вы проходите мимо пустое значение - PIVOT.

Используйте это:

DECLARE @cols AS NVARCHAR(MAX) = '', 
     @query AS NVARCHAR(MAX) 

SELECT @cols = COALESCE(@cols+', ','') + '[' + cast(product_ID as varchar) + ']' FROM product 

    SET @query = N'SELECT * FROM 
        (
         SELECT 
         year(createdDate) as [year],month(createdDate) as [month],cp.product_Id as product_ID,cp.salesprice as Amount 
         FROM customer_products cp    
        )s 
        PIVOT 
        (
        SUM(Amount) 
        FOR product_Id IN ('+ @cols +')) 
    AS pvt;' 

    EXECUTE(@query) 
Смежные вопросы