私はSQL Server 2008を使用しています。異なるデータベース間でストアされたプロシージャに値のあるパラメータを渡す
にはどうすれば間で異なるデータベースが、同じサーバーストアドプロシージャに表価値あるパラメータを渡すことができますか?
両方のデータベースで同じテーブルタイプを作成する必要がありますか?
問題に応じて例またはリンクをお知らせください。
ありがとうございました。
私はSQL Server 2008を使用しています。異なるデータベース間でストアされたプロシージャに値のあるパラメータを渡す
にはどうすれば間で異なるデータベースが、同じサーバーストアドプロシージャに表価値あるパラメータを渡すことができますか?
両方のデータベースで同じテーブルタイプを作成する必要がありますか?
問題に応じて例またはリンクをお知らせください。
ありがとうございました。
(私が正しいんだ場合とデータベース間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
テーブル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.からアクセスするだけです。コード(存在しない場合は失敗します)。このコメントを受けて
動作しません。私はこのエラーを持っています "オペランドタイプの衝突:PersonalMessagesはPersonalMessagesと互換性がありません" – hgulyan
テーブルを宣言すると、現在のデータベースコンテキストにバインドされたデータ型が使用されます。つまり、「db1を使用する」、「テーブルを作成してprocを呼び出す」、「db2を使用する」などです。一時テーブルをs.pに渡すことに切り替えることができます。またはグローバルな一時表を移入し、各データベースの別の表変数を介して渡します。 –
しかし、問題は2つのデータベース間でテーブルタイプを使用することです。 – hgulyan
私はそれが可能だとは思わない - あなたは、テーブルタイプを参照することはできません両方のDBに同じ型定義があっても、一方の型の値は他方の型に割り当てられません。 –
この場合、どのような選択肢がありますか? XML型を使用していますか? – hgulyan