我有一个包含这些列的表:
Id, policy_num, month1, month2, currentMonth.
数据是通过SP更新的,为了在报告中显示正确的月份,我必须修改标题,将其更改为特定的月份名称,例如:change "currentMonth"到"january","month2";到"december","month3";";November" .
我试了如下:
declare @currentMonth varchar(20) = DATENAME(month, GETDATE());
declare @month2 varchar(20) = DATENAME (month, dateAdd(month, -1, GETDATE()));
declare @month3 varchar(20) = DATENAME (month, dateAdd(month, -2, GETDATE()));
select id, policy_num, month1 as [@currentMonth], month2 as [@month2], month3 as [@month3] from fact_report;`
但是它不起作用,如果我打印每个变量的值,它会正确显示月份,但是当我运行select查询时,它不会显示标题上的数据。
我能做什么?有没有什么演员不见了?
谢谢你的帮助。
不幸的是,您需要使用动态SQL或通过调用代码或报告工具设置列名:
declare @currentMonth varchar(20) = quotename(DATENAME(month, GETDATE()));
declare @month2 varchar(20) = quotename(DATENAME(month, dateAdd(month, -1, GETDATE())));
declare @month3 varchar(20) = quotename(DATENAME(month, dateAdd(month, -2, GETDATE())));
declare @sql varchar(150) = 'select id, policy_num, month1 as ' + @currentMonth + ', month2 as ' + @month2 + ', month3 as ' + @month3 + ' from fact_report;';
exec(@sql)
好消息是,对于动态SQL来说,这是相当安全的。要有注入问题,必须有人已经有管理员访问您的服务器,以更改系统的月份名称。只是要小心将此解决方案推广到其他用途。