2010-12-27 22 views

答えて

5

IDを返すストアドプロシージャをリンクサーバーに作成できます。

@@IDENTITYではなく、SCOPE_IDENTITY()を使用してください。

thisを参照してください。関連する質問(挿入された行の識別情報を取得する最も良い方法は?)

+0

ストアドプロシージャの作成の意味は?私はこのリンクされたサーバーコードを実行しています: "(ローカル)]に挿入します。Identifier.dbo.test (名前) 値( 'gg')"挿入されたレコードのIDを取得するにはどうすればよいですか? –

+0

@Raymond Morphy - まさにそれを意味します。リンクされたサーバー上でそのコードを持つストアドプロシージャを作成し、 'SCOPE_IDENTITY()'を返して、OKにします。クエリでは、リモートサーバー変数ではなく_local_サーバー変数にのみアクセスできます。 – Oded

+0

それは、私は私の挿入ステートメントを入れて、SCOPE_IDENTITY()の後に、リモートサーバーのストアドプロシージャで意味ですか? –

0

ここではSQL Server 2012を使用しています。

私はGBN方法を試してみたが、私はこのエラーを得た:

Msg 405, Level 16, State 1, Line 1 
A remote table cannot be used as a DML target in a statement which includes an OUTPUT clause or a nested DML statement. 

はそれに加えて、私は分散トランザクションを使用していたとして、私の文の前にSET XACT_ABORT ON;を追加する必要がありました。

だから私は、これを行うことにより、問題の両方を解決することになった:

BEGIN DISTRIBUTED TRANSACTION 

SELECT idcolumn 
FROM OPENQUERY(MyRemoteServer, ' 
    SET XACT_ABORT ON; 
    INSERT INTO MyRemoteBD.dbo.SomeTable(col1,col2, ...) 
    OUTPUT INSERTED.idcolumn 
    VALUES (val1,val2, ...); 
    SET XACT_ABORT OFF'); 

COMMIT 

そして、私は私の挿入からアイデンティティを取得しながら、分散トランザクションでこれを実行することができました。

このステートメントに関する奇妙な動作は、以前に分散トランザクションでなければならないInsert文を実行すると、次のIDを返しますが、何も挿入しないということです。なぜこれが起こっているのか分かりません。

編集:

は、この他の方法を試してみましたが、それが分散トランザクションにXACT_ABORT ONの設定を必要とせずに働いていたとの取引せずに正常に動作しています。

exec [MyRemoteServer].MyRemoteBD.dbo.sp_executesql N' 
    INSERT INTO SomeTable (col1,col2,...) 
    VALUES (val1,val2,...); 
    SELECT SCOPE_IDENTITY()' 
関連する問題