TSQL - If..Else déclaration à l'intérieur des fonctions Table-Values - ne peut pas passer
Avant de poster j'ai lu quelques articles sur le développement de USD fonctions, mais n'ont pas rencontré de solutions pour mon problème... qui est comme suit:
J'ai une question très simple base de données, qui stocke les joueurs de basket-ball et se compose d'identité, l'Âge, la taille et le Nom de la colonne. Ce que je voudrais faire est de mettre en œuvre une fonction "hauteur" avec un paramètre @jeu de type varchar(10), qui selon l'une @réglez la valeur de déclenchement différentes instructions select
ce que j'essayais de mettre en œuvre était en pseudo-code:
CREATE FUNCTION [dbo].[age](@set varchar(10))
RETURNS TABLE
AS
BEGIN
IF (@set = 'tall')
SELECT * from player where height > 180
ELSE IF (@set = 'average')
SELECT * from player where height >= 155 and height <=175
ELSE IF (@set = 'low')
SELECT * from player where height < 155
END
Quelqu'un pourrait-il me donner un indice comment la mettre en œuvre?
source d'informationauteur Artur
Vous devez vous connecter pour publier un commentaire.
La forme la plus simple est toujours la meilleure
Cette forme est appelée table en ligne de la fonction, ce qui signifie que SQL Server est libre de se dilater pour rejoindre le joueur directement à d'autres tables en ligne de plus de requête, de rendre effectuer infiniment1 mieux qu'un multi-déclaration de la fonction à valeur de table.
Vous préférerez peut-être cette même, de sorte que vos plages sont complètes (vous avez un écart entre 175 et 180)
SQL Server prend soin de court-circuiter les branches lorsque la variable @jeu est analysé.
1 exagéré, mais seulement légèrement
Proximité. À l'aide d'un multi-déclaration de la table de la fonction nécessite la table de retour à être précisés et complétés dans la fonction:
Je vous conseille d'utiliser une ligne TVF comme Richard réponse de la montre. Il est possible de déduire le tableau de retour à partir de votre déclaration.
Notez également qu'un multi-déclaration et inline Tvf sont très différents. Une ligne TVF est de moins en moins de "boîte noire" de l'optimiseur et de plus en plus comme un paramétrées à l'optimiseur d'être en mesure de réorganiser les choses avec d'autres tables et de vues dans le même plan d'exécution.
Pourquoi êtes-vous coder en dur, créez un les hauteurs de la table, puis saisir toutes les hauteurs qui sont valables pour la gamme
Cela devrait fonctionner.
Je vais laisser le < cas pour votre plus grand plaisir.
Quelque chose comme ceci:
Nous pouvons utiliser la fonction Table de la manière suivante SI les conditions sur les.
Selon Itzik Ben-Gan dans son livre "TSQL Interrogation" (Itzik Ben-Gan et al(c) 2015 Microsoft Press, ISBN 978-0-7356-8504-8, P. 215) "...je trouve inline Tvf être un outil formidable, permettant l'encapsulation de la logique et de la réutilisabilité, sans les problèmes de performance de l'UDF..."
Il dit également que si vous avez besoin d' "...une réutilisables expression de table une Vue, mais vous avez aussi besoin de transmettre les paramètres d'entrée de la table d'expression...TSQL fournit les fonctions table en ligne (Tvf). "
Ce type de 'SI' ( fonction inline - un type distinct dans sys.objets ) utilise les revenus de la TABLE de sortie de spécificateur et, apparemment, ne peut pas contenir de début /FIN. La syntaxe et les allocations sont très restrictives, pourtant, nous voyons bien l'optimisation et de performances. Ces facteurs sont indiqués par les timings vu par @ryk.