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, desejarei descobrir os metadados para cada conjunto de resultados em todos os procedimentos armazenados 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 descrever. Ou seja, o 2º, o 3º e o enésimo 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
Respostas:
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:
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
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 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 umBEGIN 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).
fonte