Лучший способ получить личность вставленной строки в 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.