我有一个系统从同一台服务器上的不同数据库中提取数据。这个数据库每年都新连接到服务器上。在2013年初,附加了一个名为2012的数据库。 所以我想创建一个存储过程(SP)来获取用户的输入,该输入可以是2005年(年)的任何内容。因此,根据用户输入的年份,SP应该转到该数据库(其名称将是用户输入的年份)并在数据库内搜索数据(其参数是用户输入的年份),这也将具有与db具有相同名称的表(即该表将与年份名称具有相同的名称)。 希望这是有道理的
答案 0 :(得分:0)
我不是DBA,所以请耐心等待,并了解可能有更好的方法来做到这一点,但你可能要做的就是这样:
CREATE PROCEDURE usp_foo
@Year varchar(4)
AS
DECLARE @sql varchar(255)
@sql = 'SELECT * from [' + @Year + '].[owner].[table]'
sp_executesql @sql
当然,调用此sproc的用户必须A)有权调用系统sprocs B)有权访问年度数据库
此外,您可以只创建一个可以使用正确的目录填充的动态连接字符串,然后将SQL查询直接发送到数据库,而不是使用SQL路由。就个人而言,我更喜欢使用动态SQL。
答案 1 :(得分:0)
你可以做的一件事是看一下同义词,你可以每年创建一个:
http://sommarskog.se/dynamic_sql.html#Dyn_DB
CREATE SYNONYM otherdbtbl FOR otherdb.dbo.tbl
我推荐他的网站,它充满了好东西,这是一个很好的阅读:)
至于这是否适合您,我希望它取决于每个数据库中有多少个表。如果有一些可能有用,如果有数百个可能另一种方法可能效果更好 - 比如abszero建议在应用层进行切换?
答案 2 :(得分:0)
对查询进行参数化是一个好主意。
e.g。
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
查看this