Est-il possible d'utiliser une procédure stockée en tant que sous-requête dans SQL Server 2008?

J'ai deux procédures stockées, dont l'une renvoie une list de paiements, tandis que l'autre renvoie un résumé de ces paiements, regroupés par devise. À l'heure actuelle, j'ai une requête en double: la requête principale de la procédure stockée qui renvoie la list des paiements est une sousrequête de la procédure stockée qui renvoie le récapitulatif des paiements par devise. Je voudrais éliminer cette duplicité en faisant la procédure stockée qui renvoie la list de paiements une sous-requête de la procédure stockée qui renvoie le résumé des paiements par devise. Est-ce possible dans SQL Server 2008?

Vous feriez mieux de convertir le premier proc en une fonction TABLE-VALUE. Si cela implique plusieurs instructions, vous devez d'abord définir la structure de la table de return et la remplir.

Échantillon:

CREATE proc getRecords @t char(1) as set nocouut on; -- other statements -- -- final select select * from master..spt_values where type = @t GO 

— devient —

 CREATE FUNCTION fn_getRecords(@t char(1)) returns @output table( name sysname, number int, type char(1), low int, high int, status int) as begin -- other statements -- -- final select insert @output select * from master..spt_values where type = @t return end; 

Cependant, s'il s'agit d'une sélection directe (ou peut être écrite comme une seule instruction), vous pouvez utiliser le formulaire INLINE tvf, qui est hautement optimisé

 CREATE FUNCTION fn2_getRecords(@t char(1)) returns table as return -- **NO** other statements; single statement table -- select * from master..spt_values where type = @t 

Le deuxième proc sélectionne simplement du premier proc

 create proc getRecordsByStatus @t char(1) as select status, COUNT(*) CountRows from dbo.fn2_getRecords(@t) group by status 

Et où vous appeliez

 EXEC firstProc @param 

pour get un résultat, vous en select maintenant

 SELECT * FROM firstProc(@param) 

Insérer les résultats de votre proc stocké dans une variable de table ou une table temporaire fera l'affaire.

Si vous essayez de réutiliser le code dans SQL Server d'une requête à la suivante, vous disposez de plus de flexibilité avec les fonctions de table. Les vues sont correctes si vous n'avez pas besoin de transmettre des parameters ou d'utiliser une logique de contrôle de stream. Ceux-ci peuvent être utilisés comme des tables dans toute autre fonction, procédure, vue ou instruction t-sql.

Vous pouvez capturer la sortie d'une procédure stockée dans une table temporaire, puis utiliser la table dans votre requête principale.

Capturez la sortie d'une procédure stockée en returnnant l'ID et le nom des colonnes à une variable de table.

 declare @T table (ID int, Name nvarchar(50)) insert into @T exec StoredProcedure 

Si vous avez fait la procédure qui returnne la list dans une fonction table, je crois que vous pourriez l'utiliser dans une sous-requête.

J'utiliserais une vue, à less qu'elle n'ait besoin d'être paramétrée, auquel cas j'utiliserais si possible une fonction table en ligne, à less qu'il ne s'agisse d'une opération multi-instructions, où vous pouvez toujours utiliser une fonction table, mais ils sont généralement less efficaces.