Preciso chamar um procedimento armazenado em outro banco de dados e verificar o valor de retorno. O nome do outro banco de dados pode variar, então estou tentando usar sp_executesql, mas não consegui descobrir como obter o valor de retorno do procedimento.
Esta é uma versão simplificada do que eu tenho:
DECLARE @errorLogId INT
DECLARE @otherDbName NVARCHAR(MAX) = 'Foo' -- Get the database name from somewhere
DECLARE @sql NVARCHAR(MAX)
SET @sql = @otherDbName + '.dbo.SomeProc'
-- I want @errorLogId to be the return value from SomeProc, this didn't work.
EXECUTE @errorLogId = sp_executesql @sql
IF @errorLogId <> 0
RAISERROR('SomeProc failed, ErrorLogId = %d.', 16, 1, @errorLogId) WITH SETERROR
Se ocorrer um erro em SomeProc, ele for detectado e uma entrada for gravada em uma tabela de erros (no outro banco de dados), SomeProc retornará o ID da tabela de erros (identidade) do registro que foi gravado. Caso contrário, SomeProc retornará 0.
Eu sei que SomeProc está falhando porque um erro é gravado no log de erros no outro banco de dados, mas no banco de dados local @errorLogId é 0, que é tratado como sucesso. Eu pensei que o valor de retorno seria 'passado' sp_executesql, mas acho que o valor de retorno é realmente de sp_executesql não SomeProc (ou seja, sp_executesql pode ser bem-sucedido independentemente de SomeProc ter sucesso ou falhado).
Existe uma maneira de acessar o valor de retorno de @otherDbName.dbo.SomeProc no banco de dados local?
Obrigado
Você precisa usar o parâmetro OUTPUT, conforme descrito no artigo do MSDN :
Dado este procedimento armazenado fictício:
Este código lhe dará o resultado:
Execute o procedimento (contendo os parâmetros de saída e entrada) e visualize os resultados
IF spCHGAssetGet é o nome do procedimento armazenado.
@CustomerID, @AssetID são os parâmetros de saída.
@IDTicketItem, @IDExtWarranty são os parâmetros de entrada.