【问题标题】:T sql CONCAT by comma dynamic queryT sql CONCAT 逗号动态查询
【发布时间】:2015-09-02 17:05:15
【问题描述】:

我有如下动态 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

代码块。错误显示附近有语法错误

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 中删除最后一个,
  • 以上查询为 [0],[3],[11] 这就是我添加的原因,如果您说我必须删除,我该如何解决谢谢
  • 在连接之后和定义@query之前使用SET @cols = LEFT(@cols, LEN(@cols) - 1)。并查看my answer 示例演示
  • @lad2025 谢谢它的工作原理
  • 作为旁注。在您调用EXEC (@QUERY) 之前,我几乎总是调用PRINT @QUERY,这样我就可以看到动态SQL 正在生成什么。它可以省去很多麻烦,并使您可以控制生成的代码。一种很好的简单调试方法。

标签: sql-server tsql pivot


【解决方案1】:

您需要从@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))定义长度是一个好习惯

【讨论】:

  • 仅供参考,如果您在CASTCONVERT 函数中未定义varchar 的长度,默认长度将为30 个字符。如果你在变量声明中未定义varchar的长度,默认长度将只有1个字符。
【解决方案2】:

您需要确保从选择列表中删除最后一个逗号,或者您将一个空值传递给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)

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多