4

複数のデータベースがあります。動的な識別子に基づいてデータベースの 1 つをヒットできますか? たとえば、3 つのデータベースがありますDB1,DB2,DB3

クエリがありますselect * from tblEmployees(このテーブルは 3 つの DB すべてに存在します)。値が1または2または3の識別子(または変数)があり、サービスがヒットしたときに動的に取得するこの変数の値に基づいて、値を取得するDBを選択したいと思います.

これはできますか?私のDBはSQL Serverフロントエンドですasp.net

私の接続文字列は web.config ファイルに保存されています。diff db 名を持つ同じサーバーを持つ複数の接続文字列を持ち、識別子に基づいてそれらのいずれかを選択できますか?

4

5 に答える 5

2

1.実際には、ほとんどの場合、接続文字列を web.config ファイルに保存する必要があります。そこで、サーバーは同じだがデータベース名が異なる 3 つの接続文字列を保持して、必要なデータベースへのアプリ接続用の接続文字列の 1 つを選択できます。

2.必要に応じて、実行時にその接続文字列を構築できます。

これらの手法を使用すると、2 つ以上のクエリを記述する必要がなくなり、クエリ文字列を変更するだけで、クエリがすべてのデータベースで機能します。

于 2013-06-10T07:21:27.320 に答える
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

これを試してみてください -

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

IMO では、異なる接続文字列を使用して、同様のデータベースに対してマルチテナンシーを実現することをお勧めします。理想的には、いくつかのコードの背後に抽象化して、コードのほとんどがそれについて知る必要がないようにしますが、次のことを行います。

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

または最悪の場合:

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

(これEnvironmentenum、さまざまなデータベースが表すものです)

whereGetOpenConnectionは、必要なデータベースを特定し、正しい接続文字列を構成します。

しかし、具体的に言うと:

  • クエリで DB 名をパラメータ化することはできません
  • 操作間で使用useすることは、接続の再利用に関して非常に悪い考えです
  • DB1..SomeTable3 部構成の識別子 (または)を明示的に使用できますがDB1.dbo.SomeTable、それは多くのデータベースに自然にスケーリングしません。
于 2013-06-10T07:19:46.870 に答える