2010-10-04 13 views
6

D'abord j'essaie d'expliquer les circonstances. Je stocke l'expression de filtre dans une colonne séparée par des sauts de ligne. L'idée de base était la suivante:Pourquoi ne peut-on pas utiliser l'instruction INSERT EXEC dans une procédure stockée appelée par une autre procédure stockée?

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

Ensuite, j'exécute simplement cette chaîne pour placer les données dans une table temporaire. Mon problème commence ici. L'extrait est dans une procédure stockée et utilisé par plusieurs procédures stockées pour générer la source de base à remplir.
Approche 1:
Appelez cette variable à partir d'un autre SP pour remplir une table temporaire.
Résultat 1:
Une instruction INSERT EXEC ne peut pas être imbriquée. (. Si je l'appelle tout simplement avec exec dbo ... style le code fonctionne que je reçois l'erreur si je tente d'appeler dans une procédure stockée)

Approche 2:
Je mets le code ci-dessus dans une table fonction de valeurs.
Résultat 2:
Utilisation invalide d'un opérateur à effets latéraux 'INSERT EXEC' dans une fonction. (La fonction elle-même ne pas compilé)

Merci,
Péter

Répondre

4

En attendant, j'ai réussi à résoudre le problème (avec de l'aide :)). La solution est simple:

exec('insert into t2 ' + @str) 

Où @str contient une instruction select.
Je ne sais pas pourquoi mais de cette façon il n'y a pas d'erreur. La méthode que j'appelle la procédure stockée:

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

J'espère que j'accorde du temps à d'autres personnes avec cette solution.
Bye,
Péter

+2

Cela ne fonctionne pas.Au moins dans MS Transact SQL 2008. – Jackson

2

Il est une restriction SQL Server. Vous ne pouvez pas avoir un insert exec imbriqué (je ne sais pas pourquoi).

Si vous allez:

insert into t(value) 
exec dbo.proc 

, et à l'intérieur dbo.proc vous avez

insert into t2(value2) 
exec(@str) 

, il ne fonctionnera pas. Envisagez différentes manières de faire passer des tables, par exemple temporary tables ou table-valued parameters.

+0

Salut GSerg, je Je ne comprends pas comment cela affecte le problème central. La partie où la chaîne convertie en une table doit toujours être en bas de la pile d'appel. Donc, simplifier ma question, comment mettre cette chaîne dans une table et utiliser les résultats dans les procédures stockées ci-dessus? Merci, Péter –

+0

Juste une supposition, mais pour éviter une boucle infinie. –

-1

Fonctions sur SQL Server ont des limites, ils arenot procédures, vous ne pouvez pas utiliser SQL dynamique comme 'EXECUTE STRING', 'INSERT EXEC' ...