我有一个系统,可以从同一服务器上的不同数据库获取数据。这些数据库每年都会新附加到服务器,例如2013年初,附加了一个名为
2012
的数据库。
我想创建一个存储过程来获取用户的输入,该输入可以是 2005 年(年)以来的任何内容。根据用户输入的年份,存储过程应该转到该数据库(其名称将是用户输入的年份)并在数据库中搜索数据(其参数是用户输入的年份),该数据库还将包含与数据库同名的表(即该表的名称与年份名称相同)。
希望这是有道理的
参数化查询是个好主意。
例如
CREATE PROC usp_bar
(@ID INT)
AS
BEGIN
DECLARE @SQL NVARCHAR(100)
DECLARE @Params NVARCHAR(100)
SET @SQL = N'SELECT * FROM [Table] WHERE ID = @ID'
SET @Params = N'@ID INT'
EXEC sp_executesql @SQL, @Params, @ID = 5
END
看看这个
我不是 DBA,所以对此持保留态度,并理解可能有更好的方法来做到这一点,但你可能需要做的是这样的:
CREATE PROCEDURE usp_foo
@Year varchar(4)
AS
DECLARE @sql varchar(255)
@sql = 'SELECT * from [' + @Year + '].[owner].[table]'
sp_executesql @sql
当然,调用此存储过程的用户必须 A) 有权调用系统存储过程 B) 有权访问年度数据库
此外,您可以创建一个动态连接字符串,然后用正确的目录填充该字符串,然后直接向数据库发出 SQL 查询,而不是采用 SQL 路径。就我个人而言,我更喜欢使用动态 SQL。
您可以做的一件事是查看同义词,您可以为每年创建一个:
http://sommarskog.se/dynamic_sql.html#Dyn_DB
CREATE SYNONYM otherdbtbl FOR otherdb.dbo.tbl
我推荐他的网站,里面充满了好东西,读起来很棒:)
至于这是否适合您,我希望这取决于每个数据库中有多少个表。如果是几个,这可能会起作用,如果是数百个,也许另一种方法可能会更好 - 就像abszero建议的在应用程序层中进行切换一样?