SQL Server -我想根据使用的标识符选择数据库
本文关键字:标识符 选择 数据库 Server SQL | 更新日期: 2023-09-27 18:17:33
我有多个数据库。我能否根据动态标识符访问其中一个数据库?我有三个数据库DB1,DB2,DB3
。
我有一个查询select * from tblEmployees
(此表存在于所有三个db中)。我有一个标识符(或一些变量),其值可以是1或2或3,并且基于我在服务被击中时动态获得的这个变量的值,我想选择应该从中获得值的DB。
这能做到吗?我的DB是SQL Server
,前端是asp.net
。
我的连接字符串存储在web中。配置文件。我可以有多个连接字符串,这将有相同的服务器与diff db名称,并选择其中一个基于标识符。
1。在现实世界中,大多数情况下,您必须将连接字符串存储在web中。配置文件。你可以让我们保留三个连接字符串它们会有相同的服务器但不同的数据库名称,然后你可以为你的应用连接到所需的数据库选择一个连接字符串。
2。如果需要,可以在运行时构建该连接字符串。
使用这些技术,您将永远不必编写2个或更多查询,只需更改查询字符串,您的查询将适用于所有数据库。
你可以这样做
if(val == 1)
{
select * from [DB1].[dbo].[tblEmployees]
}
else if(val == 2)
{
select * from [DB2].[dbo].[tblEmployees]
}
试试这个-
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
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
在我看来,最好的办法是使用不同的连接字符串来实现对类似数据库的多租户。理想情况下,抽象在一些代码后面,这样大多数代码不需要知道它,而只需要知道:
using(var conn = Somewhere.GetOpenConnection()) {
// ...
}
或最坏情况:
using(var conn = Somewhere.GetOpenConnection(Environment.Published)) {
// ...
}
(这里Environment
是不同数据库所代表的enum
)
,其中GetOpenConnection
计算出需要哪个数据库,并查找构建正确的连接字符串。
但是具体来说:
- 不能在查询中参数化DB名称
- 在操作之间使用
use
在连接重用方面是一个非常糟糕的主意 - 您可以显式地使用三部分标识符(即
DB1..SomeTable
或DB1.dbo.SomeTable
),但这并不能自然地扩展到许多数据库