将年份变量分配给Excel工作表的列别名

时间:2016-09-29 08:09:35

标签: sql-server excel tsql dynamic sql-server-2014

我有一个excel表绑定到存储过程。在存储过程中,我选择出现在Excel工作表中的列。现在,当我想添加更多列时,我遇到了一个问题:

  • 一些价值2016
  • 一些价值2017
  • 某些值2018

第一列是将实际年份添加到标题中,将另外两列添加到下一页和下一页之后的年份。

我的问题是我不知道如何动态地这样做。我尝试过这样的事情:

DECLARE @actualYear INT = YEAR(GETDATE())

SELECT tab.Name,
    myTable.SomeValue [Some value @actualYear],
    myTableNext.SomeValue [Some value @actualYear+1],
    myTableAfterTheNext.SomeValue [Some value @actualYear+2]
FROM SomeTable tab
LEFT JOIN MyTable myTable ON tab.SomeId = myTable.SomeId
    AND myTable.[Year] = @actualYear
LEFT JOIN MyTable myTableNext ON tab.SomeId = myTableNext.SomeId
    AND myTable.[Year] = (@actualYear+1)
LEFT JOIN MyTable myTableAfterTheNext ON tab.SomeId = myTableAfterTheNext.SomeId
    AND myTable.[Year] = (@actualYear+2)

输出如下:

+------+------------------------+--------------------------+--------------------------+
| Name | Some value @actualYear | Some value @actualYear+1 | Some value @actualYear+2 |
+------+------------------------+--------------------------+--------------------------+

第二次尝试:

SELECT tab.Name,
    myTable.SomeValue ['Some value' + @actualYear]
    ...

输出:

+------+----------------------------+ ...
| Name | 'Some value' + @actualYear | ...
+------+----------------------------+ ...

如何动态获取正确的列标题?

1 个答案:

答案 0 :(得分:1)

您必须创建一个动态的SQL查询,如下所示(简短示例):

ga:date

转换为您的SQL查询,这应该是这样的:

declare @i int;
declare @sql nvarchar(max);

set @i = 2016;
set @sql = N'select 1 as [' + cast(@i as nvarchar) + N']';

exec(@sql);

如何轻松地将SQL查询转换为动态SQL查询:

enter image description here

注意,在Notepad ++中,您应该将正则表达式declare @sql nvarchar(max); declare @actualYear int = year(getdate()); set @sql = @sql + N'select tab.Name, ' set @sql = @sql + N' myTable.SomeValue [' + cast(@actualYear as nvarchar) + N'], ' set @sql = @sql + N' myTableNext.SomeValue [' + cast(@actualYear + 1 as nvarchar) + N'], ' set @sql = @sql + N' myTableAfterTheNext.SomeValue [' + cast(@actualYear + 2 as nvarchar) + N'] ' set @sql = @sql + N'from SomeTable tab ' set @sql = @sql + N'left join MyTable myTable ' set @sql = @sql + N'on tab.SomeId = myTable.SomeId ' set @sql = @sql + N' and myTable.Year = @actualYear ' set @sql = @sql + N'left join MyTable myTableNext ' set @sql = @sql + N'on tab.SomeId = myTableNext.SomeId ' set @sql = @sql + N' and myTable.Year = (@actualYear + 1) ' set @sql = @sql + N'left join MyTable myTableAfterTheNext ' set @sql = @sql + N'on tab.SomeId = myTableAfterTheNext.SomeId ' set @sql = @sql + N' and myTable.Year = (@actualYear + 2); ' exec(@sql); 替换为^(.*)$

更新

可能将上述内容实现到存储过程中(仅限简短示例):

set @sql = @sql + N'\1 '