web-dev-qa-db-fra.com

Renvoie plusieurs valeurs d'une fonction SQL Server

Comment renvoyer plusieurs valeurs (par exemple, un nombre et une chaîne) d'une fonction définie par l'utilisateur dans SQL Server?

40
Jeremy Stein

en faire une fonction table

voir ici http://technet.Microsoft.com/en-us/library/ms191165.aspx , exemple inclus

33
devio

Une autre option consisterait à utiliser une procédure avec des paramètres de sortie - Utilisation d’une procédure stockée avec des paramètres de sortie

15
Rockcoder

Erland Sommarskog a publié un article exhaustif sur la transmission de données dans SQL Server:

http://www.sommarskog.se/share_data.html

Il couvre SQL Server 2000, 2005 et 2008, et il devrait probablement être lu dans tous ses détails, car les avantages et les inconvénients de chaque méthode sont amplement couverts. Cependant, voici les points saillants de l'article (figé dans le temps à compter de juillet 2015) dans le but de fournir des termes de recherche pouvant être utilisés pour une recherche plus détaillée:

Cet article aborde deux questions connexes:

  • Comment utiliser le jeu de résultats d’une procédure stockée dans une autre, également exprimé par Comment puis-je utiliser le jeu de résultats d’une
    procédure dans une instruction SELECT?
  • Comment puis-je transmettre les données d'une table dans un paramètre d'une procédure stockée à une autre?

Paramètres de sortie

  • Non applicable, mais parfois négligé.

Fonctions à valeur de table

  • C'est souvent le meilleur choix pour la sortie uniquement, mais il existe plusieurs restrictions.
  • Exemples:
    • Fonctions en ligne: Utilisez ceci pour réutiliser un seul SELECT.
    • Fonctions multi-instructions: lorsque vous devez encapsuler une logique plus complexe.

Utiliser un tableau

  • La solution la plus générale. Mon choix préféré pour les scénarios d’entrée/sortie.
  • Exemples:
    • Partage d'une table temporaire: principalement pour une seule paire d'appelant/appelé.
    • Table de processus: le meilleur choix pour de nombreux appelants du même appelant.
    • Tables temporaires globales: une variante de la clé de processus.

Paramètres de table

  • Req. Version: SQL 2008
  • Principalement utile lors de la transmission de données à partir d'un client.

INSERT-EXEC

  • Séduisant, mais doit être utilisé avec parcimonie.

Utilisation du CLR

  • Req. Version: SQL 2005
  • Complexe, mais utile en dernier recours lorsque INSERT-EXEC ne fonctionne pas.

OPENQUERY

  • Difficile avec de nombreux pièges. Découragé.

Utiliser XML

  • Req. Version: SQL 2005
  • Un peu de kludge, mais pas sans avantages.

Utilisation des variables de curseur

  • Non recommandable.
9
fordareh

Voici le modèle d'analyseur de requêtes pour une fonction en ligne. Il renvoie 2 valeurs par défaut:

-- =============================================  
-- Create inline function (IF)  
-- =============================================  
IF EXISTS (SELECT *   
   FROM   sysobjects   
   WHERE  name = N'<inline_function_name, sysname, test_function>')  
DROP FUNCTION <inline_function_name, sysname, test_function>  
GO  

CREATE FUNCTION <inline_function_name, sysname, test_function>   
(<@param1, sysname, @p1> <data_type_for_param1, , int>,   
 <@param2, sysname, @p2> <data_type_for_param2, , char>)  
RETURNS TABLE   
AS  
RETURN SELECT   @p1 AS c1,   
        @p2 AS c2  
GO  

-- =============================================  
-- Example to execute function  
-- =============================================  
SELECT *   
FROM <owner, , dbo>.<inline_function_name, sysname, test_function>   
    (<value_for_@param1, , 1>,   
     <value_for_@param2, , 'a'>)  
GO  
8
dkretz

Exemple d'utilisation d'une procédure stockée avec plusieurs paramètres de sortie

Comme l'utilisateur Mr. Brownstone l'a suggéré, vous pouvez utiliser un procédure stockée _; pour que tout soit facile, j'ai créé un exemple minimaliste. Tout d'abord créer une procédure stockée :

Create PROCEDURE MultipleOutParameter
    @Input int,
    @Out1 int OUTPUT, 
    @Out2 int OUTPUT 
AS
BEGIN
    Select @Out1 = @Input + 1
    Select @Out2 = @Input + 2   
    Select 'this returns your normal Select-Statement' as Foo
          , 'amazing is it not?' as Bar

    -- Return can be used to get even more (afaik only int) values 
    Return(@Out1+@Out2+@Input)
END 

Appel de la procédure stockée

Pour exécuter la procédure stockée quelques variables locales sont nécessaires pour recevoir la valeur:

DECLARE @GetReturnResult int, @GetOut1 int, @GetOut2 int 
EXEC @GetReturnResult = MultipleOutParameter  
    @Input = 1,
    @Out1 = @GetOut1 OUTPUT,
    @Out2 = @GetOut2 OUTPUT

Pour voir le contenu des valeurs, vous pouvez procéder comme suit

Select @GetReturnResult as ReturnResult, @GetOut1 as Out_1, @GetOut2 as Out_2 

Ce sera le résultat:

Result of Stored Procedure Call with multiple out parameters

1
surfmuggle