我相信问题是IN ()
表达于PIVOT
s。列列表明确必须是字段名称列表,而不是函数,也不是 varchar 文字或函数值的列表。你有一个REPLACE()
在那里发挥作用。引擎期望寻找一个名为[REPLACE]
然后对出现的左括号感到困惑。
这是有效的(方括号表示强调):
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
([Emp1], [Emp2], [Emp3], [Emp4], [Emp5])
)AS unpvt;
这不是:
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
('Emp1', 'Emp2', 'Emp3', 'Emp4', 'Emp5')
)AS unpvt;
这是无效的:
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
(REPLACE('Emp1','1','A'), REPLACE('Emp2','2','B'))
)AS unpvt;
更换execute(@query)
with a select @query
or print @query
查看代码生成的查询并以这种方式对查询分析器中的语法进行故障排除。然后向后工作。
你想做REPLACE()
在您构建查询的同一级别。最终的查询@query
变量应该已经固定了列名。
或者,您可以生成@colsFromLabels
, @colsToLabels
, @colsFrom
and @colsTo
与前两者有'from'
and to
添加位,后两个只是列名。
就方括号转义而言,您想要的输出也有点粗糙。