dm_exec_describe_first_result_set_for_object para vários conjuntos de resultados

9

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_objectnã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

JJS
fonte
3
Não, não existe isso no SQL Server, você precisaria escrever código para fazê-lo (e provavelmente teria que fazer suposições em muitos casos).
Aaron Bertrand

Respostas:

3

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_sete 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).

Solomon Rutzky
fonte