I am inserting record in a remote Sql Server using Linked server, Now I wanna get the id of inserted record. something like scope_identity()
in local server.
My
Yet another variation, in case linked user has permission to call procedures on linked server:
DECLARE @ScopeIdentity int
EXEC [linkedServerName].[database].[schema].sp_executesql N'
INSERT INTO [table] ...
SELECT @ScopeIdentityOut = SCOPE_IDENTITY()',
N'@ScopeIdentityOut INT OUTPUT',
@ScopeIdentityOut = @ScopeIdentity OUTPUT
Updated per comments on 2019-04-29.
You could use the remote side's sp_executesql
:
DECLARE @ScopeIdentity TABLE (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;
Alternatively, you could use OPENQUERY
:
SELECT *
FROM OPENQUERY(server, '
INSERT INTO database.schema.table (columns) VALUES (values);
SELECT SCOPE_IDENTITY() AS ID');
try something like this:
--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()')
the EXEC will return a result set containing the SCOPE_IDENTITY()
value
if you have to do this for SQL Server 2005+ you can just add an OUTPUT INSERTED.IdentityColumn
to get a result set of the identitie(s). Add an INTO
onto that OUTPUT
and you can store them in a table/table variable on the local machine.