Eu tenho um procedimento armazenado que retorna vários conjuntos de registros para uso em um aplicativo. Às vezes, alguns desses conjuntos de registros estão vazios.
Eu gostaria de reduzir a sobrecarga e retornar apenas aqueles que têm 1 ou mais linhas.
Minha pergunta é - Como posso retornar apenas os conjuntos de registros que possuem linhas?
O aplicativo simplesmente espera 0 ou mais conjuntos de registros, faz um loop em cada um e os imprime.
Eu sei que posso ignorá-los no código do aplicativo, mas estou tentando impedir que eles sejam retornados, se estiverem vazios.
O procedimento é tão simples quanto isto:
CREATE PROCEDURE bfsp_PROC_NM
AS
BEGIN
SELECT * FROM TABLE_1
SELECT * FROM TABLE_2
SELECT * FROM TABLE_3
RETURN
END
GO
No procedimento real, algumas das consultas são caras, então eu não quero ter que testar a consulta, então se ela retornar uma linha ou mais, execute-a novamente... pois seria muito caro.
Essa é uma ideia terrível. Como o aplicativo saberá qual conjunto de resultados está processando? Os procedimentos armazenados devem ter um conjunto fixo de formas de conjunto de resultados.
Dito isto, para fazer isso, carregue os resultados em tabelas temporárias e, em seguida, SELECT daquelas se não estiverem vazias.
por exemplo
Eu gosto que meu código seja previsível, se você sempre retorna X conjuntos de dados, você pode programar isso em seu aplicativo e sempre sabe o que esperar. Então talvez não seja a melhor ideia filtrar conjuntos.
No entanto, uma opção pode ser verificar se a tabela/seleção que você está executando retorna linhas, se retornar o conjunto, caso contrário, você o ignora. Isso obviamente tem um pouco de sobrecarga, pois você precisa especificá-lo para cada conjunto de resultados que está retornando.
Exemplo como visto neste código:
Supondo que os dados de todas as três tabelas tenham estrutura semelhante, você pode inserir os dados em uma única tabela temporária e, em seguida, fazer com que seu procedimento retorne um conjunto de resultados com todas as linhas disponíveis:
O conjunto de resultados retornado ainda pode estar vazio - se nenhuma das três tabelas de origem tiver dados para retornar - mas você pode determinar isso a partir dos metadados.
Se as tabelas de origem não compartilharem uma estrutura semelhante, tenho que concordar com as respostas anteriores - retornar um número variável de conjuntos de resultados é uma má ideia. Se as tabelas de origem forem diferentes e seu procedimento retornar menos de três conjuntos de resultados, você precisará verificar a lista de campos para cada conjunto de resultados apenas para descobrir o que estava faltando antes de processar os dados.