2010-03-24 3 views
3

J'ai 2 procédures stockées usp_SP1 et usp_SP2. Les deux utilisent make dans #tt exec sp_somesp. Je voulais créer une troisième procédure stockée qui décidera quel proc stocké pour appeler. Quelque chose comme:imbriqué insert exec travail autour

create proc usp_Decision 
(
    @value int 
) 
as 
begin 
    if (@value = 1) 
    exec usp_SP1 -- this proc already has insert into #tt exec usp_somestoredproc 
    else 
     exec usp_SP2 -- this proc too has insert into #tt exec usp_somestoredproc 
end 

Plus tard, je me suis aperçu que je avais besoin de structure définie pour la valeur de retour de usp_Decision afin que je puisse remplir le champ de jeu de données SSRS. Voici donc ce que j'ai essayé:

  1. Dans usp_Decision créé une table temporaire et a essayé de le faire « insérer dans #tt exec usp_SP1 ». Cela n'a pas fonctionné. erreur "insert exec ne peut pas être imbriqué"

  2. Dans usp_Decision essayé de passer la variable de table à chacun des proc stocké et mettre à jour la table dans le procs stocké et faire "select * from". Cela n'a pas fonctionné aussi bien. La variable de table passée en paramètre ne peut pas être modifiée dans le processus stocké.

Veuillez suggérer ce qui peut être fait.

+0

Le brisement d'INSERT EXEC est l'un de mes plus gros bêtisiers concernant SQL Server. S'il vous plait, votez! https://connect.microsoft.com/SQLServer/feedback/details/294571/improve-insert-exec –

Répondre

0

N'utilise pas les tables temporaires globales dans tous les cas (d'autres processus peuvent lire ces tables et interférer avec leurs données). Pourquoi ne pas avoir chaque proc utiliser une table temporaire locale et sélectionner * à partir de cette table comme dernière étape. Ensuite, vous pouvez insérer dans une table temporaire locale dans le proc appelant.

esimple exemple

create proc usp_mytest1 
as 
select top 1 id into #test1 
from MYDATABASE..MYTABLE (nolock) 

select * from #test1 
go 
--drop table #test 
create proc usp_mytest2 
as 
select top 10 MYTABLE_id into #test2 
from MYDATABASE..MYTABLE (nolock) 

select * from #test2 
go 

create proc usp_mytest3 (@myvalue int) 
as 
create table #test3 (MYTABLE_id int) 
if @myvalue = 1 
Begin 
insert #test3 
exec ap2work..usp_mytest1 
end 
else 
begin 
insert #test3 
exec ap2work..usp_mytest2 
end 

select * from #test3 

go 

exec ap2work..usp_mytest3 1 

exec ap2work..usp_mytest3 0 
+0

J'utilise la table temporaire locale dans chaque proc stockée et donc "insérer dans #tt exec usp_somestored proc".maintenant je veux faire un select * de #tt_example dans usp_Decision stocké proc je devrai insérer dans #tt_example exec usp_SP1 d'abord. mais ce n'est pas autorisé. Je ne suis pas sûr si c'était votre approche suggérée. sinon, veuillez expliquer avec un pseudo code. – stackoverflowuser

+0

J'utilise insert dans #tt exec sp_executesql @query dans mes procs stockés et donc l'approche ci-dessus ne fonctionnera pas. – stackoverflowuser

+0

pour l'instant j'ai juste combiné les procs stockés en un. C'est un énorme mais ça marche pour le moment. – stackoverflowuser

0

Avez-vous eu un regard sur les fonctions définies par l'utilisateur valeur table (soit en ligne ou multi-déclaration)? Semblable à la suggestion de HLGEM, cela retournera un ensemble que vous n'aurez peut-être pas à insérer où.

0

Voir cette blog article pour une wortkaround (utilise OPENROWSET pour créer essentiellement une connexion sur laquelle un rebouclage des appels EXEC INSERT arrive)

1

Pouvez-vous modifier usp_SP1 et usp_SP2?

Si oui, usp_Decision, créez une table temporaire locale avec le schéma approprié pour insérer les résultats:

create table #results (....) 

Ensuite, dans la procédure appelée, vérifier l'existence de cette table temporaire. S'il existe, insérez-le dans la table temporaire. Si ce n'est pas le cas, renvoyez le jeu de résultats comme d'habitude. Cela permet de préserver le comportement existant, si les procédures imbriquées sont appelées d'ailleurs.

if object_id('tempdb..#results') is not null begin 
    insert #results (....) 
    select ..... 
end 
else begin 
    select .... 
end 

Lorsque le contrôle revient à la procédure d'appel, #results auront été renseignés par le proc imbriqué, selon l'une a été appelé.

Si les ensembles de résultats ne partagent pas le même schéma, vous devrez peut-être créer deux tables temporaires dans usp_Decision.

Questions connexes