0

同じサーバー上の異なる DB からデータをフェッチするシステムがあります。この DB は毎年サーバーに新しく接続されます。たとえば、2013 年の初めに、2012 という名前のデータベースが接続されます。だから私は、2005年(年)からのユーザーの入力を取得するストアドプロシージャ(SP)を作成したいと考えています。そのため、ユーザーが入力した年に基づいて、SP はそのデータベース (ユーザーが入力した年が名前になります) に移動し、データベース内のデータ (ユーザーが入力した年をパラメーターとして) を検索する必要があります。データベースと同じ名前のテーブル (つまり、テーブルは年名と同じ名前になります)。これが理にかなっていることを願っています

4

3 に答える 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

これをチェックしてください

于 2012-08-24T13:57:44.493 に答える
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 を使用するよりもそれを好みます。

于 2012-08-24T13:36:15.143 に答える
0

できることの 1 つは、類義語を調べることです。年ごとに 1 つ作成できます。

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

CREATE SYNONYM otherdbtbl FOR otherdb.dbo.tbl

私は彼のサイトをお勧めします、それは良いものでいっぱいです、それは素晴らしい読み物です:)

これがうまく機能するかどうかは、各 DB にいくつのテーブルがあるかによって決まると思います。アプリケーション層でスイッチングを行うというabszeroの提案のように、数百の場合は別のアプローチがうまくいく可能性がありますか?

于 2012-08-24T13:47:03.723 に答える