Лучший способ получить идентичность вставленной строки в связанном сервере? - PullRequest
12 голосов
/ 19 апреля 2011

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

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

Ответы [ 3 ]

12 голосов
/ 19 апреля 2011

Вы можете использовать sp_executesql на удаленной стороне:

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

Кроме того, вы можете использовать OPENQUERY:

SELECT *
FROM OPENQUERY(<i>server</i>, '
  INSERT INTO <i>database</i>.<i>schema</i>.<i>table</i> (<i>columns</i>) VALUES (<i>values</i>);
  SELECT SCOPE_IDENTITY() AS ID');
2 голосов
/ 12 сентября 2016

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

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

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

0 голосов
/ 19 апреля 2011

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

--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 и вы можете сохранить их в переменной таблицы / таблицы на локальном компьютере.

...