Existe um procedimento para retornar metadados para todos os conjuntos de resultados em um procedimento armazenado?
Algo como sys.dm_exec_describe_first_result_set_for_object
, mas para todos os conjuntos de resultados?
Eventualmente, vou querer descobrir os metadados para cada conjunto de resultados em cada procedimento armazenado no banco de dados. Por enquanto, eu aceitaria apenas os conjuntos de resultados que sys.dm_exec_describe_first_result_set_for_object
não podem ser descritos. Ou seja, o 2º, 3º e Nº conjuntos de resultados.
Olhando para usar o SQLCLR para fazer isso agora:
Como salvar resultados de um procedimento com mais de um conjunto de resultados
tSQLt - Teste de unidade de banco de dados para SQL Server - ResultSetFilter.cs
Não e sim.
Não
Não há meio T-SQL puro de acessar mais do que o primeiro conjunto de resultados. Mesmo OPENROWSET e OPENQUERY têm a mesma limitação:
Para registro, não estou dizendo nem sugerindo que haja 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
esys.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 conjuntos de resultados 2 - n é por meio do 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 por meio do código do aplicativo, não há limitações de não funcionar com SQL dinâmico e tabelas temporárias .realmente execute o código SQL e, se você tiver instruções DML e quiser apenas os metadados do conjunto de resultados sem causar alterações nos dados, será necessário agrupar o SQL que está testando em umBEGIN TRAN
/ROLLBACK TRAN
.O tipo de aplicativo pode ser um aplicativo normal do Windows, um aplicativo de console, um aplicativo da Web, etc., ou pode até ser uma função/procedimento armazenado SQLCLR.
Com relação a fazer isso via SQLCLR, já existe um procedimento armazenado que faz o que está descrito aqui. Chama-se DB_DescribeResultSets e faz parte da biblioteca SQL# (da qual sou o autor e, embora exista uma versão Free, DB_DescribeResultSets só está disponível na versão Full).