2010-11-14 4 views
0

J'ai une procédure dans une base de données tierce appelée GetDocumentHistory. Cette procédure renvoie toutes sortes d'informations sur un document et son historique. Cette procédure accepte DocumentId comme paramètre - et fait toutes sortes de logique métier interne. Quand cela s'exécute, j'obtiens tout ce dont j'ai besoin. Ce que je dois faire est de passer cette procédure un DocumentId, mais j'ai beaucoup de DocumentIds que je dois exécuter pour cela.Possible de créer une procédure stockée qui boucle à travers un autre et les syndicats?

Je cherche à écrire ma propre procédure qui accepte OwnerId, que je trouve tous les DocumentIds associés à ce propriétaire, et appelle la procédure GetDocumentHistory individuellement pour chaque DocumentId que j'ai trouvé. Je voudrais alors que les résultats de toutes les exécutions de la procédure GetDocumentHistory soient renvoyés de ma procédure dans un grand ensemble de résultats. La procédure GetDocumentHistory ne peut pas être facilement modifiée pour renvoyer tous ces enregistrements, et il ne s'agit pas d'un SELECT simple, mais de nombreuses variables de chargement et de faire des choses avec eux. Est-il possible de boucler et d'unir les résultats?

Merci beaucoup pour votre aide.

+0

C'est trop vague pour nous d'être une aide, mais vous aurez de chances d'obtenir de meilleures performances en intégrant la logique de la procédure stockée dans la nouveau plutôt que de regarder la combinaison des ensembles de résultats (en supposant que c'est possible). –

Répondre

1

Vous pouvez essayer insert ... exec. Cela vous oblige à spécifier exactement ce que la procédure stockée renvoie. Voici un exemple:

if OBJECT_ID('dbo.GetDocumentHistory') is not null 
    drop procedure dbo.GetDocumentHistory 
go 
create procedure dbo.GetDocumentHistory(
    @DocumentId int) 
as 
    select 'Ghost Writer' as Author 
    ,  @DocumentId as Number 
go 
if OBJECT_ID('dbo.GetMultiDocHistory') is not null 
    drop procedure dbo.GetMultiDocHistory 
go 
create procedure dbo.GetMultiDocHistory(
    @a int 
, @b int) 
as begin 
    declare @t table (name varchar(50), number int) 

    declare @i int 
    set @i = @a 
    while @i <= @b 
     begin 
     insert @t exec dbo.GetDocumentHistory @i 
     set @i = @i + 1 
     end 

    select name, number from @t 
end 
go 
exec dbo.GetMultiDocHistory 1, 3 

Cette impression:

name    number 
Ghost Writer  1 
Ghost Writer  2 
Ghost Writer  3 
Questions connexes