我有一些名为DB2012,DB2013,DB2014,DB2015,DB2016的数据库
我在函数中有一个select语句,如下所示
SELECT columnName1,columnName2, ... FROM [DB2015].[dbo].tableName
我必须每年更改此代码才能使用前一年,但我希望将其设置为通用代码并自动获取去年的DB名称。我无法找到解决该问题的任何方法。任何帮助将不胜感激。
答案 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_)