Puis-je joindre une table avec une procédure stockée qui renvoie une table?Procédure stockée du serveur SQL
Merci
Puis-je joindre une table avec une procédure stockée qui renvoie une table?Procédure stockée du serveur SQL
Merci
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
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.
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
Puis-je rejoindre sans créer une table temporaire? – Rauf
Ne le pense pas. –
@Rauf - réponse mise à jour – RichardTheKiwi