2010-10-04 14 views
6

Innanzitutto cerco di spiegare le circostanze. Memorizzo l'espressione filtro in una colonna separata da interruzioni di riga. L'idea di base era questa:Perché non è possibile utilizzare l'istruzione INSERT EXEC all'interno di una stored procedure richiamata da un'altra stored procedure?

SELECT 
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + '''' 
FROM dbo.topic_filter T 
WHERE 
    T.id = @id 
FOR XML PATH('') 

Dopo questo, eseguo semplicemente questa stringa per inserire i dati in una tabella temporanea. Il mio problema inizia qui. Lo snippet si trova in una stored procedure e viene utilizzato da più stored procedure per generare l'origine di base da riempire.
Approccio 1:
Chiamare questa sp da un altro SP per riempire una tabella temporanea.
Risultato 1:
Un'istruzione INSERT EXEC non può essere nidificata. (. Se chiamo semplicemente con dbo exec ... stile il codice sta lavorando ho solo l'errore se provo a chiamare all'interno di una stored procedure)

Approccio 2:
ho messo il codice di cui sopra in una tabella funzione valori.
Risultato 2:
Uso non valido di un operatore di effetti collaterali "INSERT EXEC" all'interno di una funzione. (La funzione stessa non compilato)

Grazie,
Péter

risposta

4

Nel frattempo sono riuscito a risolvere il problema (con l'aiuto :)). La soluzione è semplice:

exec('insert into t2 ' + @str) 

Dove @str contiene un'istruzione select.
Non so perché ma in questo modo non ci sono errori. Il metodo che chiamo la stored procedure:

SET @exec = 'exec dbo.trFilterTopic ''' + @id+ ''',null,null,1' 
INSERT INTO #filtered 
exec (@exec) 

Spero di risparmiare tempo ad altri con questa soluzione.
Bye,
Péter

+2

Questo non funziona.Almeno in MS Transact SQL 2008. – Jackson

2

Si tratta di una limitazione di SQL Server. Non puoi avere un nidificato insert exec (non sono sicuro del perché).

Se andate:

insert into t(value) 
exec dbo.proc 

, e dentro dbo.proc avete

insert into t2(value2) 
exec(@str) 

, allora non verrà eseguito.

Considerare diversi modi di passare le tabelle, ad esempio temporary tables o table-valued parameters.

+0

Ciao GSerg, ho non capisco come questo influenzi il problema principale. La parte in cui la stringa convertita in tabella deve ancora trovarsi nella parte inferiore del callstack. Quindi semplificare la mia domanda, come mettere quella stringa in una tabella e utilizzare i risultati nelle stored procedure sopra di essa? Grazie, Péter –

+0

Solo una supposizione, ma per evitare un ciclo infinito. –

-1

Funzioni su SQL Server hanno dei limiti, hanno arenot procedure, non è possibile utilizzare SQL dinamico come 'ESEGUIRE STRING', 'INSERT EXEC' ...

Problemi correlati