Eu preciso gerar uma ou mais mensagens de aviso dentro de um procedimento armazenado filho e, em seguida, coletar todas elas no pai. Eu tentei
RAISERROR('Message 1',0,0) WITH NOWAIT
, mas não funciona ( ERROR_MESSAGE()
é NULL no código abaixo).
Desejo algo como o código abaixo, que não está funcionando.
Não precisa ser RAISERROR
, qualquer solução é aceita.
create procedure test_child
as begin
RAISERROR('Message 1',0,0) WITH NOWAIT;
RAISERROR('Message 2',0,0) WITH NOWAIT;
RAISERROR('Message 3',0,0) WITH NOWAIT;
end
;
create procedure test_parent
as begin
declare @err nvarchar(max);
exec test_child;
set @err = error_message();
select @err
end
;
exec test_parent;
Você não poderá usar os mecanismos de tratamento de erros no SQL Server para comunicar mais de uma mensagem de erro. Não há "coleta de erros" (ou qualquer outra coisa) que você possa fazer um loop no código de chamada para obter cada mensagem de erro individual.
Além disso, ERROR_MESSAGE() será null se não for chamado em um bloco CATCH. Da documentação do produto:
Sugiro que você tenha o proc inserindo dados relevantes em uma tabela e o código de chamada agora pode examinar essa tabela.
O artigo de Erland sobre compartilhamento de dados entre procedimentos armazenados pode ser útil: https://www.sommarskog.se/share_data.html
Talvez armazenar seus avisos em uma variável de tabela e retornar que possa atender às suas necessidades?
Se for possível, você também pode transformar o proc em uma função com valor de tabela para obter o mesmo resultado final.