Sql server 通过逗号动态查询的T sql CONCAT
我有如下动态sql查询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]
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]这就是我添加的原因,如果你说我必须删除thanksUseSET@cols=LEFT(@cols,LEN(@cols)-1)
在连接之后和定义@query之前,我该如何解决。请看样品demo@lad2025谢谢,这只是一个旁注。在调用EXEC(@QUERY)
之前,我几乎总是调用PRINT@QUERY
,以便查看动态SQL生成的内容。它省去了很多麻烦,并使您能够控制生成的代码。debug.FYI的一种简单方法,如果在CAST
或CONVERT
函数中未定义varchar
的长度,默认长度将为30个字符。如果在变量声明中未定义varchar
的长度,默认长度将仅为1个字符。