2010-12-27 31 views

Respuesta

5

Puede crear un procedimiento almacenado en su servidor vinculado que devolverá la identidad.

Debería estar usando SCOPE_IDENTITY() en lugar de @@IDENTITY, por cierto.

Consulte this pregunta relacionada (¿La mejor manera de obtener la identidad de la fila insertada?).

+0

¿Cuál es su significado de crear procedimiento almacenado? Estoy ejecutando este código de servidor vinculado: "insertar en [(local)]. Identificación.dbo.test (nombre) values ​​('gg')" ahora ¿qué debo hacer para obtener la identificación del registro insertado? –

+0

@Raymond Morphy - Quiero decir exactamente eso. Cree un procedimiento almacenado con ese código en el servidor vinculado, haga que devuelva 'SCOPE_IDENTITY()' y usted debería estar bien. Su consulta solo tiene acceso a las variables del servidor _local_, no a las variables del servidor remoto. – Oded

+0

¿Significa que debo colocar mi declaración de inserción y luego SCOPE_IDENTITY() después de eso en el procedimiento almacenado en el servidor remoto? –

0

Usando SQL Server 2012 aquí.

He intentado método GBN pero me dio este error:

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. 

Además de eso, tenía que añadir el SET XACT_ABORT ON; antes de mi declaración como estaba usando transacciones distribuidas.

Así que terminé resolver tanto los problemas al hacer esto:

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 

Y yo era capaz de ejecutar esto en una transacción distribuida al obtener la identidad de mi inserción.

Un comportamiento extraño acerca de esta afirmación es que si ejecuto la instrucción Insertar sin abrir previamente la Transacción distribuida (debe ser la distribuida) devolverá la siguiente identidad, pero no insertará nada. No tengo idea de por qué está sucediendo esto.

Editar:

probado este otro método y ha funcionado sin la necesidad de establecer XACT_ABORT ON sobre las transacciones distribuidas y funciona bien sin transacciones.

exec [MyRemoteServer].MyRemoteBD.dbo.sp_executesql N' 
    INSERT INTO SomeTable (col1,col2,...) 
    VALUES (val1,val2,...); 
    SELECT SCOPE_IDENTITY()' 
Cuestiones relacionadas