T sql CONCAT 逗号动态查询

T sql CONCAT by comma dynamic query

我有如下动态 sql 查询。

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)

从 Product 中选择 productID 时,我到底错过了上述查询中缺少的内容?

您需要从@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))

定义长度

您需要确保从 select 列表中删除最后一个逗号,否则您将向 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)