Лучший способ получить личность вставленной строки в Linked server?

Я вставляю запись на удаленном сервере Sql с помощью связанного сервера. Теперь я хочу получить идентификатор вставленной записи. что-то вроде scope_identity() на локальном сервере. Мой удаленный сервер sql - это версия 2000 года.

Я видел этот пост, но я не могу добавить какие-либо хранимые процедуры на удаленном сервере sql

Ответ 1

Вы можете использовать удаленную сторону 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;

В качестве альтернативы вы можете использовать OPENQUERY:

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

Ответ 2

попробуйте что-то вроде этого:

--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()')

EXEC вернет результирующий набор, содержащий значение SCOPE_IDENTITY()

если вам нужно сделать это для SQL Server 2005+, вы можете просто добавить OUTPUT INSERTED.IdentityColumn, чтобы получить результирующий набор идентификаторов. Добавьте INTO к этому OUTPUT, и вы можете сохранить их в переменной таблицы/таблицы на локальной машине.

Ответ 3

Еще один вариант, если связанный пользователь имеет право вызывать процедуры на связанном сервере:

DECLARE @ScopeIdentity int
EXEC @ScopeIdentity = [linkedServerName].[database].[schema].sp_executesql N'
  INSERT INTO [table] ...
  SELECT @ScopeIdentityOut = SCOPE_IDENTITY()',
  N'@ScopeIdentityOut INT OUTPUT',
  @ScopeIdentityOut = @ScopeIdentity OUTPUT

Обновлено за комментарии на 2019-04-29.