2011-06-27 28 views
1

だから私はデータベースにsprocを持っています。このデータベースをAと呼ぶことができます。このdbは別のdbのテーブル(t1, t2)を使用します。このdbをBと呼ぶことができます。別のデータベースからストアドプロシージャを実行している

大丈夫、私は今それを呼び出す方法は次のとおりです。A.dbo.My_Procが、私は別のエラーを取得する:私は、パラメータを供給しようとしたので、どのように

Invalid object name 'dbo.t1'.

。私のSproc私は、select * from @dbname.dbo.t1 しかし、それはエラーになります。私はdbのsprocを入れることができないB

ハードコード(方法があれば)で十分ですが、db Bは毎年変更されるため、データベースを「供給」するのが良いでしょう。

私はuse B; goを使ってみましたが、それはsprocでそれを持つことができないと言って私にエラーを与えます。

EDIT

+0

あなたは 'A.dbo.My_Proc'を実行したアカウントには、データベースへのアクセス権を持っていますか? –

+0

はい。私は現在、それは私が手動でそれを入力するとすべての作品を意味します。 sprocからの 'B.dbo.table1'のようなものですが、' B'が供給されたいのですが。 – masfenix

答えて

1

あなたは同義語を作成することができ、私は今、シノニムが、テーブルではなく、procのために必要とされていることがわかります。それらは切り替えられました。だから、あなたは、データベースBのテーブルのデータベースAにシノニムを作成することができます。

USE A; 
CREATE SYNONYM dbo.t1 FOR B.dbo.t1; 

を次にAにおけるあなたの手順は単純に言うことができる:

SELECT * FROM dbo.t1; 

を手動ですべてのデータベース名を指定しなくても、クエリがCにすると、データベースBの変更データベースBのテーブルからデータを取得する(同義語に基づいて)知っている、あなたは、単にすることができます:

DROP SYNONYM dbo.t1; 
CREATE SYNONYM dbo.t1 FOR C.dbo.t1; 

あなたは「本当の」データベース名を使用した場合任意のA/B名とは対照的に、あなたの物語では、理解が容易になるかもしれません。ちょうど提案。

/EDIT

:-)他のオプションは、データベース名に渡し、動的SQLを介して構築することです。例えば。代わりに(働くことは決してありません)dbname.dbo.t1 @から*を選択し、あなたが行うことができます:

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM ' + QUOTENAME(@dbname) + '.dbo.t1;'; 
EXEC sp_executesql @sql; 

しかし、この他のデータベース名は、実際には年に一度変更した場合、私は同義語ルートが優れていることを示唆しています全体。

+0

+1のシノニム - 私はダイナミックSQLを呼び出すつもりでしたが、シノニムははるかにクリーンです溶液。 – JNK

+0

シノニムルートの使い方を理解していませんか?より具体的な例を挙げてください。ありがとうございました! – masfenix

+0

実行されたSQLへの簡単な '@ dbname'連結の結果として生じるSQLインジェクションの脆弱性に注意してください。 –

1

exec someDB.dbo.SomeProcを実行すると、実行コンテキストがsomeDBに切り替わります。したがって、手順でSELECT FROM dbo.t1が発行された場合、dbo.t1someDBである必要があります。あなたが手順は「供給」のデータベースから選択したい場合は、手順がdynamic-SQLを使用する必要があります。

create procedure someProc 
    @dbname sysname 
as 
begin 
... 
set @sql = N'SELECT ... FROM ' + quotename(@dbname) +N'.dbo.t1'; 
exec sp_executesql @sql; 
... 
end 
関連する問題