Eu tenho um procedimento que faz uma ou duas inserções em uma tabela remota. Para realizar o segundo insert, preciso saber o Id inserido recentemente do primeiro insert. Para fazer isso funcionar, minha cláusula de inserção facilita a cláusula OUTPUT que me informa o Id da primeira inserção.
Isso funciona bem se o banco de dados de chamada (contendo o procedimento que faz a inserção) e o banco de dados do receptor residirem no mesmo SQL Server, que é o caso do meu ambiente de desenvolvimento. No ambiente de produção, no entanto, o banco de dados de chamada e o banco de dados do receptor residem em SQL Servers diferentes, o que gera a seguinte mensagem de erro:
Msg 405, Nível 16, Estado 1, Procedimento ProcedureName , Linha LineNumber . Uma tabela remota não pode ser usada como um destino DML em uma instrução que inclua uma cláusula OUTPUT ou uma instrução DML aninhada.
Editar (a cláusula OUTPUT na tabela temporária):
declare @message table(MeddelandeKöId bigint primary key, MessageId bigint)
...
output
cast(substring(inserted.ApplicationCustomPublicData, 4, 16) as bigint) MessageQueueId,
inserted.Id MessageId
into @message
Qual é a melhor abordagem para resolver o erro atual? Devo fazer uma seleção simples, desconsiderando a instrução de saída, para obter a linha inserida recentemente ou existe outra solução melhor para esse problema específico?
Obrigado pelo seu tempo!
(reescrito, mal interpretado)
Se você deseja o ID remoto, a melhor maneira é usar um procedimento armazenado no servidor remoto e retornar um conjunto de resultados.
Ou não redirecione para uma tabela temporária/variável de tabela. Isso não está no escopo do servidor remoto
Veja estes no SO: