在 SQL Server 2008 R2 中创建动态存储过程

问题描述 投票:0回答:3

我有一个系统,可以从同一服务器上的不同数据库获取数据。这些数据库每年都会新附加到服务器,例如2013年初,附加了一个名为

2012
的数据库。

我想创建一个存储过程来获取用户的输入,该输入可以是 2005 年(年)以来的任何内容。根据用户输入的年份,存储过程应该转到该数据库(其名称将是用户输入的年份)并在数据库中搜索数据(其参数是用户输入的年份),该数据库还将包含与数据库同名的表(即该表的名称与年份名称相同)。

希望这是有道理的

c# asp.net sql-server-2008-r2
3个回答
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

看看这个


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。


0
投票

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

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

CREATE SYNONYM otherdbtbl FOR otherdb.dbo.tbl

我推荐他的网站,里面充满了好东西,读起来很棒:)

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

© www.soinside.com 2019 - 2024. All rights reserved.