在MSSQL SERVER 2008 R2上创建动态存储过程

时间:2012-08-24 13:24:53

标签: c# asp.net sql-server-2008

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

3 个答案:

答案 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