Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 通过逗号动态查询的T sql CONCAT_Sql Server_Tsql_Pivot - Fatal编程技术网

Sql server 通过逗号动态查询的T sql CONCAT

Sql server 通过逗号动态查询的T sql CONCAT,sql-server,tsql,pivot,Sql Server,Tsql,Pivot,我有如下动态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]

我有如下动态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中删除最后一个
,添加

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

可以考虑使用XML而不是CONTAT类:

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

定义
cast的长度(产品ID为varchar(10))

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

我想你需要从@colsabove查询中删除最后一个
,作为[0],[3],[11]这就是我添加的原因,如果你说我必须删除thanksUse
SET@cols=LEFT(@cols,LEN(@cols)-1)
在连接之后和定义@query之前,我该如何解决。请看样品demo@lad2025谢谢,这只是一个旁注。在调用
EXEC(@QUERY)
之前,我几乎总是调用
PRINT@QUERY
,以便查看动态SQL生成的内容。它省去了很多麻烦,并使您能够控制生成的代码。debug.FYI的一种简单方法,如果在
CAST
CONVERT
函数中未定义
varchar
的长度,默认长度将为30个字符。如果在变量声明中未定义
varchar
的长度,默认长度将仅为1个字符。