0

我有一个从同一服务器上的不同数据库获取数据的系统。这些数据库每年都会新附加到服务器上。例如,在 2013 年初,附加了一个名为 2012 的数据库。所以我想创建一个存储过程(SP)来获取用户的输入,它可以是 2005 年(年)的任何内容。因此,根据用户输入的年份,SP 应该转到该数据库(其名称将是用户输入的年份)并在数据库中搜索数据(其参数是用户输入的年份),该数据也将具有与 db 同名的表(即该表将与年份名称相同)。希望这是有道理的

4

3 回答 3

0

我不是 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。

于 2012-08-24T13:36:15.143 回答
0

您可以做的一件事是查看同义词,您可以为每年创建一个:

http://sommarskog.se/dynamic_sql.html#Dyn_DB

CREATE SYNONYM otherdbtbl FOR otherdb.dbo.tbl

我会推荐他的网站,里面有很多好东西,读起来很棒:)

至于这是否适合您,我希望这取决于您在每个数据库中有多少表。如果是几个,这可能会起作用,如果是数百个,那么另一种方法可能会更好——比如 abszero 建议在应用层进行切换?

于 2012-08-24T13:47:03.723 回答
0

将查询参数化是一个好主意。

例如

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

看看这个

于 2012-08-24T13:57:44.493 回答