根据年份选择不同的表

时间:2016-04-14 20:23:13

标签: tsql

我正在尝试构建一个用于水晶报表的视图,以便我们查找GL代码。不幸的是,我们的ERP每年都会创建一个新的SQL表,并将最后两位数字附加到表名上。

除非我能找到一种方法来根据日期更改它所查看的表格,否则每年我需要为我创建的每个视图手动更改视图。有什么建议吗?

This Year: select * from GL000016
Next Year: select * from GL000017

4 个答案:

答案 0 :(得分:2)

这是MSSQL版本:

DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @TableName AS NVARCHAR(100)
SET @TableName = 'GL0000' + RIGHT(CONVERT(CHAR(4), GETDATE(), 120),2)
SET @SQLQuery = 'SELECT * FROM ' + @TableName
EXECUTE sp_executesql @SQLQuery

您还可以根据环境使用存储过程。 @Tablename将保留表名,如果这就是你需要的(即SELECT @Tablename)。

答案 1 :(得分:0)

您可以使用T-SQL Year函数。

  

返回表示指定日期年份的整数。

https://msdn.microsoft.com/en-us/library/ms186313.aspx

所以对于今年,以下将返回17。

select (YEAR(GETDATE()) % 100) + 1

答案 2 :(得分:0)

不完全可以为Views

动态切换表

如果要切换要选择的表,则需要使用IF语句或执行Dynamic sql。考虑到您想在视图中执行此操作,您无法使用这两者。所以从我的角度来看,你的选择是:

  1. 切换到使用存储过程并使用动态sql或if语句
  2. 切换到使用返回表的函数(再次,动态sql或if语句)
  3. 定期运行存储过程的Sql作业,该存储过程使用动态sql以正确的GL帐户表名重新创建视图。
  4. 如果你必须使用一个视图,那么3可能是你的选择,但它带来了维护和切换开销。从事该项目的下一个人可能想知道为什么他们的视图更改会被覆盖。

答案 3 :(得分:0)

创建一个与GL0000XX表的通用结构相匹配的临时表。

然后,您必须使用动态SQL来查询表。

CREATE TABLE #GL ....;

DECLARE @year char(2) = YEAR(GETDATE()) % 100;

INSERT INTO #GL
EXEC('SELECT * FROM GL0000' + @year);