我有一个excel表绑定到存储过程。在存储过程中,我选择出现在Excel工作表中的列。现在,当我想添加更多列时,我遇到了一个问题:
第一列是将实际年份添加到标题中,将另外两列添加到下一页和下一页之后的年份。
我的问题是我不知道如何动态地这样做。我尝试过这样的事情:
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 | ...
+------+----------------------------+ ...
如何动态获取正确的列标题?
答案 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查询:
注意,在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 '