2010-12-27 7 views

답변

5

ID를 반환하는 연결된 서버에서 저장 프로 시저를 만들 수 있습니다.

그런데 @@IDENTITY 대신 SCOPE_IDENTITY()을 사용해야합니다.

this 관련 질문 (삽입 된 행의 ID를 얻는 가장 좋은 방법은?)을 참조하십시오.

+0

저장 프로 시저를 만드는 의미는 무엇입니까? 이 링크 된 서버 코드를 실행하고 있습니다 : "insert into [(local)]. Identifier.dbo.test (name) values ​​('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()' 
관련 문제