4

我有多个数据库。我可以根据动态标识符访问其中一个数据库吗?例如,我有三个数据库DB1,DB2,DB3

我有一个查询select * from tblEmployees。(该表存在于所有三个数据库中)。我有一个标识符(或某个变量),其值可以是 1 或 2 或 3,并且根据我在服务被命中时动态获得的这个变量的值,我想选择应该从中获取值的数据库.

这可以做到吗?我的数据库是SQL Server,前端是asp.net.

我的连接字符串存储在 web.config 文件中。我可以有多个连接字符串,它们将具有具有不同数据库名称的同一服务器,并根据标识符选择其中一个。

4

5 回答 5

2

1.在现实世界中,大多数时候您必须将连接字符串存储在 web.config 文件中。所以你可以让我们保留三个连接字符串,它们将具有相同的服务器但不同的数据库名称,然后你可以为你的应用程序连接到所需的数据库选择一个连接字符串。

2.如果需要,您可以在运行时构建该连接字符串。

使用这些技术,您将永远不必编写 2 个或更多查询,只需更改查询字符串,您的查询将适用于所有数据库。

于 2013-06-10T07:21:27.320 回答
0

试试这个——

DECLARE @ID INT
SELECT @ID = 2

DECLARE @SQL NVARCHAR(500)
SELECT @SQL = 'SELECT * FROM DB' + CAST(@ID AS CHAR(1)) + '.dbo.tblEmployees'

PRINT @SQL
EXEC sys.sp_executesql @SQL

输出 -

SELECT * FROM DB2.dbo.tblEmployees
于 2013-06-10T07:19:05.203 回答
0

T-SQL方式:

declare @db int


if @db = 1
begin

    use [db1]
    select *
    from tblEmployees

end

if @db = 2
begin
    use [db2]
    select *
    from tblEmployees
end

-- and so on
于 2013-06-10T07:19:07.273 回答
0

你可以这样做

if(val == 1)
{
  select * from [DB1].[dbo].[tblEmployees]
}
else if(val == 2)
{
  select * from [DB2].[dbo].[tblEmployees]
}
于 2013-06-10T07:15:55.873 回答
0

IMO你最好的选择是使用不同的连接字符串来实现针对类似数据库的多租户。理想情况下,抽象出一些代码,这样你的大部分代码就不需要知道它,而只是:

using(var conn = Somewhere.GetOpenConnection()) {
    // ...
}

或最坏的情况:

using(var conn = Somewhere.GetOpenConnection(Environment.Published)) {
    // ...
}

(这Environmentenum各种数据库所代表的内容)

whereGetOpenConnection找出需要哪个数据库,然后查找构造正确的连接字符串。

但具体来说:

  • 您不能在查询中参数化数据库名称
  • use就连接重用而言,在操作之间使用将是一个非常糟糕的主意
  • 您可以显式使用三部分标识符(即DB1..SomeTableor DB1.dbo.SomeTable),但这并不能自然地扩展到许多数据库
于 2013-06-10T07:19:46.870 回答