2010-04-01 5 views
18

Comment combiner l'exécution d'une procédure stockée et l'utilisation de son résultat ou de ses paramètres dans une requête SQL normale?Combiner une procédure stockée et une requête dans T-SQL

Par exemple, je voudrais faire quelque chose comme ce qui suit:

-- passing result of SELECT to SP 
SELECT a, b FROM t 
EXEC my_sp a, b 

-- passing result of SP to INSERT  
INSERT INTO t 
EXEC my_sp a, b 

etc.

+0

Pouvez-vous réécrire votre question? Cela n'a pas beaucoup de sens dans sa forme actuelle. – JohnFx

+0

@JohnFx: Je demande à propos de toutes les combinaisons possibles de SP et DML. Pourquoi cela n'a aucun sens? – abatishchev

+0

Sans vouloir vous offenser, je pense simplement que le sens de votre question se perd dans la traduction plutôt pauvre en anglais. – JohnFx

Répondre

24

non, vous devez utiliser une table temporaire

create table #results (col1 int, col2 varchar(5) ...) 

INSERT INTO #results 
    EXEC YourProcedure @parma... 

alors vous pouvez rejoindre à

SELECT 
    * 
    FROM YourTable  y 
     JOIN #results r ON ... 
    .... 

si vous ne connaissez pas les colonnes et les types de données de la procédure, vous pouvez utiliser cette excellente réponse: Insert results of a stored procedure into a temporary table

En bref, il utilise OPENROWSET pour exécuter la procédure stockée dans une table #temp créée à la volée, sans le besoin de nommer et connaître le type toutes les colonnes.

4

Si votre SP peut être réécrit comme une table UDF de table en ligne, celles-ci fonctionnent généralement très bien et sont équivalentes à une vue paramétrée. ITVF peut être utilisé n'importe où vous utiliseriez une table ou une vue. Si votre SP ne fonctionne pas comme TVF en ligne (manipulation de variable locale requise), il peut fonctionner comme un TVF multi-instructions (contient un BEGIN/END) qui peut ou non fonctionner mal selon ce que vous avez faire. Après que votre SP a été transformé en UDF, vous pouvez toujours appeler l'UDF à partir de votre SP (SELECT * FROM udf (params)) ou ailleurs, il peut être utilisé pour les jointures, etc, donc tout votre code est à l'intérieur l'UDF - pas de duplication.

Questions connexes