36 votes

L'accès à des ensembles de résultats à partir de procédures Stockées des instructions Transact-SQL de SQL Server

Je suis à l'aide de SQL Server 2005, et je voudrais savoir comment accéder à différents ensembles de résultats à partir de l'intérieur de transact-sql. La procédure stockée suivante renvoie les deux ensembles de résultats, comment puis-je accéder à partir, par exemple, d'une autre procédure stockée?

CREATE PROCEDURE getOrder (@orderId as numeric) AS
BEGIN   
    select order_address, order_number from order_table where order_id = @orderId
    select item, number_of_items, cost from order_line where order_id = @orderId
END

J'ai besoin d'être en mesure de parcourir les deux ensembles de résultats individuellement.

Merci à l'avance.

EDIT: Juste pour clarifier la question, je veux tester les procédures stockées. J'ai un ensemble de procédures stockées qui sont utilisés à partir d'un VB.NET client, qui retournent plusieurs ensembles de résultats. Ce ne sont pas va être changé pour une fonction à valeur de table, je ne peux pas en fait changer les procédures à tous. La modification de la procédure n'est pas une option.

Les jeux de résultats retournés par les procédures ne sont pas les mêmes types de données ou le nombre de colonnes.

34voto

Brannon Points 12633

La réponse courte est: vous ne pouvez pas le faire.

À partir de T-SQL il n'y a aucun moyen d'accéder à de multiples résultats d'un appel de procédure stockée imbriquée, sans modifier la procédure stockée comme d'autres l'ont suggéré.

Pour être complet, si la procédure de retour d'un résultat unique, vous pouvez l'insérer dans une table temporaire ou une variable de table avec la syntaxe suivante:

INSERT INTO #Table (...columns...)
EXEC MySproc ...parameters...

Vous pouvez utiliser la même syntaxe pour une procédure qui renvoie plusieurs résultats, mais il ne sera procédé le premier résultat, le reste sera ignoré.

5voto

Il y a un quelque chose que vous pouvez faire aussi bien. Ajouter un paramètre optionnel N int de votre procédure stockée. Par défaut la valeur de N à -1. Si la valeur de N est égale à -1, puis de faire de chacun de vos sélections. Sinon, faire la Nième sélectionner et seulement la Nième sélectionner.

Par exemple,

if (N = -1 or N = 0)
    select ...

if (N = -1 or N = 1)
    select ...

Les appelants de votre procédure stockée qui ne spécifiez pas de N obtiendrez un résultat plus que l'une des tables. Si vous avez besoin d'extraire un ou plusieurs de ces tables à partir d'une autre procédure stockée, il suffit d'appeler votre procédure stockée en spécifiant une valeur de N. Vous aurez à appeler la procédure stockée une seule fois pour chaque table que vous souhaitez extraire. Inefficace si vous avez besoin de plus d'une table à partir de l'ensemble de résultats, mais il fonctionne dans le plus pur TSQL.

4voto

Chris Wuestefeld Points 1137

Notez qu'il ya un supplément, sans-papiers, la limitation de l'INSÉRER DANS ... instruction EXEC: il ne peut pas être imbriqués. Qui est, la procédure stockée que le EXEC appels (ou n'importe qu'elle appelle à son tour) ne peut lui-même faire un INSERT INTO ... EXEC. Il semble qu'il y a un seul pavé par processus, qui s'accumule à la suite, et si elles sont imbriquées, vous recevrez un message d'erreur lorsque l'appelant s'ouvre cette place, puis le destinataire de l'appel tente de l'ouvrir à nouveau.

Matthieu, vous auriez besoin de maintenir des tables temporaires pour chaque "type" de résultat. Aussi, si vous êtes l'exécution de la même plusieurs fois, vous pourriez avoir besoin d'ajouter une colonne à un résultat, pour indiquer l'appel il en a résulté.

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