Déclarer la variable dans la fonction de table


Réponses:


207

Il existe deux types de fonctions de table. Une qui n'est qu'une instruction select et une qui peut avoir plus de lignes qu'une simple instruction select.

Cela ne peut pas avoir de variable:

create function Func() returns table
as
return
select 10 as ColName

Vous devez faire comme ceci à la place:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end

34
Le premier exemple est connu sous le nom de «fonction à valeur de table en ligne» qui présente des avantages en termes de performances par rapport à une fonction à valeur de table à plusieurs instructions, à savoir que le serveur de base de données peut recomposer la requête avec l'ITVF incorporé dans la requête parente, devenant essentiellement un paramètre VIEWalors qu'un MSTVF se comporte plus comme une procédure stockée opaque (bien qu'avec ses propres avantages par rapport aux sprocs). Les fonctions en ligne doivent être préférées à MSTVF. Si vous avez besoin de calculer et de stocker des valeurs intermédiaires (telles que le résultat d'une expression de fonction scalaire complexe), utilisez une sous-requête.
Dai

1
Il est probablement également intéressant de mentionner que si le résultat de tout ce que vous utilisez pour remplir la variable que vous souhaitez définir est de quelque manière que ce soit généralisable, vous pouvez envisager d'écrire une fonction distincte pour la générer. Cela vous permettrait d'utiliser l'ITVF décrit par @Dai ci-dessus, avec tous les avantages de celui-ci, tout en insérant toujours une valeur générée dynamiquement dans votre fonction. Je viens d'écrire une fonction à l'aide de la solution ci-dessus (merci @MikaelEriksson!) Qui transmet l'un de ses paramètres à une fonction d'assistance pour m'éviter d'avoir à utiliser le formulaire MSTVF.
naughtilus

1
le plus gros coût est l'insertion pour ma fonction et je ne sais pas comment sauter ce coût sans l'insérer dans la variable de table et renvoyer le résultat de select
uzay95

@naughtilus, ce serait formidable de voir un exemple de cela. Avez-vous envisagé de fournir une autre réponse avec votre suggestion?
Jacques
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.