Использование SQL Server 2012 здесь.
Я пробовал метод gbn, но получил эту ошибку:
Msg 405, Level 16, State 1, Line 1
A remote table cannot be used as a DML target in a statement which includes an OUTPUT clause or a nested DML statement.
Кроме того, мне нужно было добавить SET XACT_ABORT ON;
перед моим заявлением, поскольку я использовал распределенные транзакции.
Итак, я решил обе проблемы, выполнив следующее:
BEGIN DISTRIBUTED TRANSACTION
SELECT idcolumn
FROM OPENQUERY(MyRemoteServer, '
SET XACT_ABORT ON;
INSERT INTO MyRemoteBD.dbo.SomeTable(col1,col2, ...)
OUTPUT INSERTED.idcolumn
VALUES (val1,val2, ...);
SET XACT_ABORT OFF');
COMMIT
И я смог запустить это в распределенной транзакции, получая удостоверение из моей вставки.
Странное поведение в отношении этого оператора заключается в том, что если я запустил оператор Вставка, не открыв распределенную транзакцию ранее (должна быть распределенной), он вернет следующую идентификацию, но ничего не вставит. Я понятия не имею, почему это происходит.
Редактировать:
Попробовал этот другой метод, и он работал без необходимости установки XACT_ABORT ON
для распределенных транзакций и прекрасно работает без транзакций.
exec [MyRemoteServer].MyRemoteBD.dbo.sp_executesql N'
INSERT INTO SomeTable (col1,col2,...)
VALUES (val1,val2,...);
SELECT SCOPE_IDENTITY ()'