2011-04-18 28 views

Respuesta

9

Se puede usar del lado remoto sp_executesql:

DECLARE @ScopeIdentity (ID int); 
INSERT INTO @ScopeIdentity 
EXEC server.master..sp_executesql N' 
    INSERT INTO database.schema.table (columns) VALUES (values); 
    SELECT SCOPE_IDENTITY()'; 
SELECT * FROM @ScopeIdentity;

Como alternativa, puede utilizar OPENQUERY:

SELECT * 
FROM OPENQUERY(server, ' 
    INSERT INTO database.schema.table (columns) VALUES (values); 
    SELECT SCOPE_IDENTITY() AS ID');
+0

¿Cambió este comportamiento entre SQL 2005/2008 a 2008R2? –

+0

@GaryKindel: No estoy seguro de entender qué quiere decir exactamente, pero gracias a su comentario noté que me perdí una cosa en ese momento, la 'N' al principio de la constante de cadena en el primer fragmento. (Actualizado mi respuesta ahora.) Sin duda es necesario en SQL Server 2008 R2, no estoy seguro acerca de las versiones anteriores. Me pregunto si la ausencia de 'N' fue la razón detrás de tu pregunta. –

+0

Me encontré con un problema hoy al tratar de usar Scope_indentity() en un INSERT a través de un servidor de enlace. Me sorprendió por sorpresa este error en mi proyecto. Me preguntaba si Scope_indentity() siempre era local en SQL 2008. Pensé que esto podría haber sido un nuevo comportamiento con R2. –

0

intentar algo como esto:

--when RemoteTable is (Rowid int identity(1,1) primary key, rowValue varchar(10)) 
exec ('INSERT server.database.owner.RemoteTable (rowValue) VALUES (''wow'');select SCOPE_IDENTITY()') 

la Exec devolver un conjunto de resultados que contiene el valor SCOPE_IDENTITY()

si tiene que hacer esto para SQL Server 2005+, puede simplemente agregar un OUTPUT INSERTED.IdentityColumn para obtener un conjunto de resultados de las identidades. Agregue un INTO en ese OUTPUT y puede almacenarlos en una variable tabla/tabla en el equipo local.

+0

Lo probé, pero devuelve NULL. ¿Qué pasa? Este es mi código: ** exec ('insert [(Worker)]. Identification.dbo.test (name) values ​​(' 'gg' '); select scope_identity()') ** –

+0

Eso no funcionará. Devolverá NULL o 0. Funcionará bien para un SQL DB local, pero no para uno vinculado. – WiredEarp

1

Usuario aún otra variación, en caso vinculado tiene permiso para llamar a los procedimientos de servidor vinculado:

DECLARE @ScopeIdentity int 
EXEC @ScopeIdentity = [linkedServerName].[database].[schema].sp_executesql N' 
    INSERT INTO [table] ... 
    SELECT SCOPE_IDENTITY()' 
+0

tuve que usar un parámetro de salida como esta: 'DECLARE @ScopeIdentity int EXEC [LinkedServerName] [base de datos].. [schema] .sp_executesql N ' INSERT INTO [table] ... SELECCIONE SCOPE_IDENTITY()', N '@ ScopeIdentityOUT INT OUTPUT', @ScopeIdentityOUT = @ScopeIdentity OUTPUT' –

Cuestiones relacionadas