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