2012-03-02 9 views
10

私はSQL Server 2008を使用しています。異なるデータベース間でストアされたプロシージャに値のあるパラメータを渡す

にはどうすれば間で異なるデータベースが、同じサーバーストアドプロシージャに表価値あるパラメータを渡すことができますか?

両方のデータベースで同じテーブルタイプを作成する必要がありますか?

問題に応じて例またはリンクをお知らせください。

ありがとうございました。

+0

私はそれが可能だとは思わない - あなたは、テーブルタイプを参照することはできません両方のDBに同じ型定義があっても、一方の型の値は他方の型に割り当てられません。 –

+0

この場合、どのような選択肢がありますか? XML型を使用していますか? – hgulyan

答えて

11

(私が正しいんだ場合とデータベース間TVPsを使用することは不可能であることを):

私はこのような状況でどのような選択肢がありますか? XML型を使用していますか?

純粋なアプローチでは、両方のデータベースが同じデータを使用している場合は、単一のデータベースにマージする必要があります。実用主義者は、これは必ずしも可能ではないことを認識していますが、呼び出し元と呼び出し先の両方を明らかに変更することができるので、両方のprocsが知っている一時テーブルを使用するだけです。


私はそれが可能だとは思わない - あなたが別のデータベースからテーブルタイプを参照することはできません、とさえ両方のDBで同じタイプの定義で、1種類の値が割り当てられませんその他。


あなたは、データベース間ではないパス一時テーブルを行います。一時テーブルは常にtempdbに格納され、接続が開いており、一時テーブルが削除されない限り、接続にアクセスできます。

だから、あなたは、呼び出し元で一時テーブルを作成:

CREATE TABLE #Values (ID int not null,ColA varchar(10) not null) 
INSERT INTO #Values (ID,ColA) 
/* Whatever you do to populate the table */ 
EXEC OtherDB..OtherProc 

をそして、呼び出し先に:

CREATE PROCEDURE OtherProc 
/* No parameter passed */ 
AS 
    SELECT * from #Values 
+0

と私はどのようにデータベース間の一時テーブルを渡すことができます。これについての例を挙げることができますか?ありがとう。 – hgulyan

+1

@hgulyan - 私の答えの一番下に例を追加しました。あなたは一切それを渡しません。 –

+0

うわー、それを知らなかった。ありがとう。よく働く! – hgulyan

1

テーブルUDTは、同じデータベース内のストアドプロシージャに対してのみ有効です。

はい、各サーバーで型を作成し、格納されたprocsで型を参照する必要があります。両方のDBのhttp://msdn.microsoft.com/en-us/library/bb510489.aspxでこの例の最初の部分を実行してください。

効率性が必要ない場合は、他の方法を使用することができます。つまり、XMLドキュメントパラメータを渡すか、s.p.入力データを持つ一時テーブルが必要です。

編集:追加例

create database Test1 
create database Test2 
go 
use Test1 
create type PersonalMessage as TABLE 
(Message varchar(50)) 
go 
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS 
    select * from @Message 
go 
use Test2 
create type PersonalMessage as TABLE 
(Message varchar(50)) 
go 
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS 
    select * from @Message 
go 
use Test1 
declare @mymsg PersonalMessage 
insert @mymsg select 'oh noes' 
exec InsertPersonalMessage @mymsg 
go 
use Test2 
declare @mymsg2 PersonalMessage 
insert @mymsg2 select 'oh noes' 
exec InsertPersonalMessage @mymsg2 

欠点は、データの2つのコピーが存在することです。 しかし、各データベースに対して同時にバッチを実行することができます。 これは、テーブルテーブルを使用するよりも優れているかどうかは、本当にあなたが持っている処理/データサイズに依存します - btwはs.pの一時テーブルを使用します。あなたはs.p.からアクセスするだけです。コード(存在しない場合は失敗します)。このコメントを受けて

+0

動作しません。私はこのエラーを持っています "オペランドタイプの衝突:PersonalMessagesはPersonalMessagesと互換性がありません" – hgulyan

+0

テーブルを宣言すると、現在のデータベースコンテキストにバインドされたデータ型が使用されます。つまり、「db1を使用する」、「テーブルを作成してprocを呼び出す」、「db2を使用する」などです。一時テーブルをs.pに渡すことに切り替えることができます。またはグローバルな一時表を移入し、各データベースの別の表変数を介して渡します。 –

+0

しかし、問題は2つのデータベース間でテーブルタイプを使用することです。 – hgulyan

関連する問題