将年份variables分配给excel工作表的列别名

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

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

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

我的问题是,我不知道如何dynamic地做到这一点。 我试过这样的事情:

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 | ... +------+----------------------------+ ... 

如何dynamic获取正确的列标题?

你将不得不像这样(简单的例子)创build一个dynamic的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查询应该是这样的:

 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); 

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

在这里输入图像说明

请注意,在Notepad ++中,您应该使用set @sql = @sql + N'\1 'replace正则expression式^(.*)$

更新

上面的存储过程的可能的实现(只是简短的例子):

 IF OBJECT_ID('procTest', 'P') IS NOT NULL DROP PROCEDURE procTest; GO CREATE PROCEDURE procTest AS BEGIN DECLARE @i INT; DECLARE @sql NVARCHAR(MAX); SET @i = 2016; SET @sql = N'insert into #t (Column1) VALUES (' + CAST(@i AS NVARCHAR) + N'); ' + N'insert into #t (Column1) ' + N'SELECT cast(1 as nvarchar) as [' + CAST(@i AS NVARCHAR) + N']'; EXEC (@sql); END; GO CREATE TABLE #t ( Column1 NVARCHAR(MAX) ); EXEC dbo.procTest; SELECT * FROM #t; DROP TABLE #t;