2010-04-01 14 views
18

Come si combina l'esecuzione di una stored procedure e l'utilizzo dei relativi risultati o parametri in una normale query SQL?Combina stored procedure e query in T-SQL

Per esempio mi piacerebbe fare qualcosa di simile al seguente:

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

ecc

+0

Riesci a riscrivere la tua domanda? Non ha molto senso nella sua forma attuale. – JohnFx

+0

@JohnFx: chiedo informazioni su tutte le possibili combinazioni di SP e DML. Perché non ha senso? – abatishchev

+0

Senza offesa, penso solo che il significato della tua domanda si sta perdendo nella traduzione un po 'povera in inglese. – JohnFx

risposta

24

no, è necessario utilizzare una tabella temporanea

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

INSERT INTO #results 
    EXEC YourProcedure @parma... 

allora si può aderire a it

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

se non si conoscono le colonne ei tipi di dati dalla procedura è possibile utilizzare questo eccellente risposta: Insert results of a stored procedure into a temporary table

In breve utilizza OPENROWSET per eseguire la stored procedure in una tabella #temp che viene creata al volo, senza la necessità di nominare e conoscere il tipo di tutte le colonne.

4

Se il tuo SP può essere riscritto come UDF con valore di tabella inline, questi in genere funzionano molto bene e sono equivalenti a una vista parametrizzata. ITVF può essere utilizzato in qualsiasi luogo si utilizzi una tabella o una vista.

Se il tuo SP non funziona come TVF in linea (necessaria manipolazione di variabili locali), può funzionare come TVF a più istruzioni (contiene un BEGIN/END) che può o meno funzionare male a seconda di quello che hai fare.

Dopo che il tuo SP è stato trasformato in UDF, puoi comunque chiamare l'UDF dal tuo SP (SELECT * FROM udf (params)) o altrove può essere usato per join, ecc, quindi tutto il tuo codice è all'interno l'UDF - nessuna duplicazione.