2 votes

Suppression de tables vides des ensembles de données de sortie de la procédure stockée TSQL?

J'ai une procédure TSQL qui effectue trois boucles afin de trouver des données pertinentes. Si la première boucle ne renvoie aucun résultat, alors la deuxième le fait généralement. Je rajoute une autre table qui contient plusieurs valeurs que je peux utiliser plus tard.

Par conséquent, je devrais avoir au maximum deux tables renvoyées dans l'ensemble de données de la procédure stockée.

Le problème est que si la première boucle est vide, je me retrouve ensuite avec trois tables de données dans mon ensemble de données.

Dans mon code C#, je peux supprimer cette table vide, mais je préférerais ne pas la renvoyer du tout à partir de la procédure stockée.

Y a-t-il un moyen de supprimer la table vide de l'intérieur de la procédure stockée, étant donné ce qui suit :

EXEC (@sqlTop + @sqlBody + @sqlBottom)
SET @NumberOfResultsReturned = @@ROWCOUNT;
.
.
.
IF @NumberOfResultsReturned = 0
    BEGIN
        SET @searchLoopCount = @searchLoopCount + 1
    END
ELSE
    BEGIN
        -- nous avons des données, donc pas besoin de relancer
        BREAK
    END

Le processus se déroule comme suit : à la première boucle, il pourrait ne pas y avoir de résultats. Ainsi, le nombre de lignes sera zéro car EXEC exécute une requête SQL dynamiquement créée. C'est une table.

Lors de la prochaine itération, des résultats sont renvoyés, ce qui fait deux tables de données dans la sortie de l'ensemble de données, plus ma troisième ajoutée à la fin.

Je ne voulais pas faire un COUNT(*) puis si > 0 alors exécuter la requête car je veux minimiser les requêtes.

Merci.

0voto

Mikael Eriksson Points 77190

Vous pouvez mettre le résultat de votre SP dans une variable de table, puis vérifier si la variable de table contient des données.

Quelque chose comme ceci avec un SP nommé GetData qui retourne une colonne entière.

déclarer @T table(ID int)
déclarer @SQL varchar(25)

-- Créer un SQL dynamique
set @SQL = 'select 1'

-- Insérer le résultat de @SQL dans @T
insérer dans @T
exéc (@SQL)

-- Vérifier les données
si non existe (sélectionner * from @T)
début
  -- Pas de données, continuer la boucle
  set @searchLoopCount = @searchLoopCount + 1
end
sinon
début
  -- Des données sont présentes, nous devons donc interroger les données
  sélectionner *
  à partir de @T

  -- Mettre fin à la boucle
  break
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X