2011-03-28 3 views

Répondre

2

Vous devez utiliser INSERT .. EXEC pour stocker les données de la SP dans une table ou d'une table variable. Ensuite, vous pouvez vous joindre à cela.

Dites le SP retourne une table (int, b varchar (10), datetime c)

declare @temp table (a int, b varchar(10), c datetime) 
; 
insert @temp 
exec myproc 1, 10, 'abcdef' 
; 
select * 
from @temp t join othertable o on ... etc 

Sans créer une table temporaire, si vous excluez également le tableau variable, alors la seule option - fournie le SP - ne prend aucun paramètre, utilise OPENQUERY pour exécuter le SP pour retourner une table. Pseudo:

select * 
from OPENQUERY(local_server, 'spname_no_params') t 
join othertable o on ... etc 
+0

Puis-je rejoindre sans créer une table temporaire? – Rauf

+1

Ne le pense pas. –

+0

@Rauf - réponse mise à jour – RichardTheKiwi

0

Non ce n'est pas possible. Ce que vous pouvez faire est de mettre la sortie de ce SP dans une table temporaire et l'utiliser pour votre déclaration de jointure.

2

Vous ne pouvez pas vous joindre directement à une procédure stockée. Vous devez donc soit utiliser l'approche par la réponse de Richard, soit convertir le sproc en une fonction de valeur table.

par exemple.

CREATE FUNCTION dbo.fxnExample(@Something INTEGER) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT A, B 
FROM MyTable 
WHERE Something = @Something 
) 

que vous utilisez ensuite/join dans une requête comme celle-ci:

SELECT t1.Foo, f.A, f.B 
FROM Table1 t1 
    JOIN dbo.fxnExample(1) f ON t1.A = f.A 

La chose à noter est que vous ne pouvez pas faire tout dans une fonction définie par l'utilisateur que vous pouvez dans un sproc si en fonction de ce que fait votre sproc, cela peut ne pas être possible. Aussi, pour de meilleures performances, vous devriez en faire une fonction de table en ligne comme mon exemple ci-dessus. L'alternative est une fonction de valeur de table multi-instructions qui pourrait vous donner une performance médiocre en raison de la façon dont le plan d'exécution produit sera basé sur l'hypothèse d'un très faible nombre de lignes renvoyées (ie 1) - donc si renvoyé un plus grand nombre de lignes, les performances peuvent être médiocres.

Voici un bon article MSDN sur elle: http://blogs.msdn.com/b/psssql/archive/2010/10/28/query-performance-and-multi-statement-table-valued-functions.aspx

Questions connexes