Comment renvoyer plusieurs valeurs (par exemple, un nombre et une chaîne) d'une fonction définie par l'utilisateur dans SQL Server?
en faire une fonction table
voir ici http://technet.Microsoft.com/en-us/library/ms191165.aspx , exemple inclus
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
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.
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
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
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: