上一年

时间:2016-04-14 14:04:45

标签: sql-server database

我有一些名为DB2012,DB2013,DB2014,DB2015,DB2016的数据库

我在函数中有一个select语句,如下所示

SELECT columnName1,columnName2, ... FROM [DB2015].[dbo].tableName

我必须每年更改此代码才能使用前一年,但我希望将其设置为通用代码并自动获取去年的DB名称。我无法找到解决该问题的任何方法。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

正如人们在我之前提到的,如果你想这样做,你将不得不使用动态SQL。

我想提供两种可能让您的工作更轻松的替代方案:

首先,如果不是真的需要,不要分开数据库。使用日期列或类似的东西添加过滤效果会更好。如果将它与适当的分区相结合,您将获得出色的性能,并且管理起来会更容易。

如果您选择分离数据库,则可以更轻松地在不同的数据库上创建视图,以便更轻松地查询数据(特别是如果您想使用代码中的ORM解决方案,以及大多数ORM' s无法轻松处理这种情况。)

在该解决方案中,为使用来自多个其他数据库的表/视图的查询创建新数据库。让我们称这个新的DB" DBReporting"。

您可以在那里创建标准视图:

    select *, 2011 'year'
FROM DB2011.dbo.sales
UNION ALL
select *, 2012 'year'
FROM DB2012.dbo.sales

然后查询此视图。

您可以做得更好:更改视图的方式将是" Partitioned View",然后SQL Server知道如何使用它来启用删除和其他操作(那里&#39 ;如果您的数据位于多个服务器上,则还支持分布式分区视图)。您可以在此处阅读:https://technet.microsoft.com/en-us/library/ms190019(v=sql.105).aspx

这将使查询比使用动态sql更容易。

希望这有帮助。

答案 1 :(得分:1)

你需要动态的SQL:

DECLARE @qry VARCHAR(MAX)
DECLARE @year INT

SELECT @year = YEAR(GETDATE()) - 1

SET @qry = 'SELECT columnName1,columnName2 ' +
           'FROM [DB' + CAST(@year AS CHAR(4)) + '].[dbo].tableName'

EXEC(@qry)

答案 2 :(得分:1)

declare @year nvarchar(4) = cast(year(getdate()) as nvarchar(4))

declare @sql nvarchar(max) = 'SELECT columnName1,columnName2, ... FROM DB' + year + '.dbo.tableName'

exec(@sql)

答案 3 :(得分:0)

获取当前年份和上一年并使用动态SQL更改查询。

DECLARE @CURRENTYEAR  AS INT = year(getdate())
DECLARE @PREVIOUSYEAR AS INT = @CURRENTYEAR - 1

DECLARE @QUERY_ VARCHAR(2000)
SET @QUERY_ = 
'SELECT
     COL_1
    ,COL_2
    ...
FROM DB' + @CURRENTYEAR + '.DBO.TABLENAME

UNION ALL

SELECT
     COL_1
    ,COL_2
    ...
FROM DB' + @PREVIOUSYEAR + '2015.DBO.TABLENAME'

EXEC(@QUERY_)