Existe um procedimento para retornar metadados para todos os conjuntos de resultados em um procedimento armazenado?
Não e sim.
Não
Não há meios T-SQL puros de acessar mais do que o primeiro conjunto de resultados. Mesmo OPENROWSET e OPENQUERY têm a mesma limitação:
Embora a consulta possa retornar vários conjuntos de resultados, OPEN (ROWSET | QUERY) retorna apenas o primeiro.
Para constar, não estou dizendo nem implicando que exista qualquer razão técnica comum para essa limitação. Estou apenas apontando que a limitação não se limita a sp_describe_first_result_set
, sys.dm_exec_describe_first_result_set
e sys.dm_exec_describe_first_result_set_for_object
.
sim
A única maneira de capturar informações - metadados do conjunto de resultados e até mesmo os resultados - para os conjuntos de resultados 2 - n é via código do aplicativo. Você primeiro executaria as consultas / procedimentos armazenados usando SqlCommand.ExecuteReader (CommandBehavior) com um CommandBehavior de KeyInfo
. Em seguida, você pode obter os metadados do conjunto de resultados usando o método SqlDataReader.GetSchemaTable e chamando o método SqlDataReader.NextResult para percorrer os conjuntos de resultados. Lembre-se de que, ao fazer isso via código do aplicativo, não há limitações de não trabalhar com SQL dinâmico e tabelas temporárias, ele temna verdade, execute o código SQL e, se você tiver instruções DML e desejar apenas os metadados do conjunto de resultados sem causar alterações nos dados, será necessário agrupar o SQL que você está testando em um BEGIN TRAN
/ ROLLBACK TRAN
.
O tipo de aplicativo pode ser um aplicativo normal do Windows, um aplicativo do console, um aplicativo da Web etc., ou ainda pode ser uma função / procedimento armazenado do SQLCLR.
Com relação a fazer isso via SQLCLR, já existe um procedimento armazenado que faz o que é descrito aqui. Ele é chamado DB_DescribeResultSets e faz parte da biblioteca SQL # (da qual sou o autor e, embora exista uma versão grátis, o DB_DescribeResultSets está disponível apenas na versão completa).