0

J'ai une fonction complexe que je veux utiliser en nombre de requêtes. Il obtient une liste de valeurs et renvoie une valeur agrégée.Comment passer le type de table défini par l'utilisateur à la fonction inline

Par exemple (je simplifie, il est plus complexe en action):

CREATE FUNCTION Mean(@N Numbers READONLY) 
RETURNS TABLE AS RETURN (
    SELECT mean = SUM(n.value)/COUNT(*) FROM @N n 
) 

et je veux l'utiliser dans la requête:

SELECT d.DepartmentName, MeanRate = m.mean 
FROM Departments d 
CROSS APPLY Mean(
    (
     SELECT value = e.Rate 
     FROM Employees e 
     WHERE e.DepatmentId = d.DepatmentId 
    ) 
) m 

Mais je reçois une erreur: Opérande type heurt: float est incompatible avec Numbers

Je sais que je peux utiliser le curseur ou passer des valeurs comme XML, mais je pense que ces moyens sont plus lents que la fonction inline et les variables de table. Comment puis-je transmettre une liste de valeurs à la fonction en ligne?

Répondre

0

Vous devez d'abord créer une variable de table en utilisant le table type (Number) utilisé dans la fonction Inline.

Insérez les lignes requises dans la variable de table et passer la variable de table o Inline function

Vous devez faire quelque chose comme ça

declare @Numbers Numbers 

Insert into @Numbers 
select e.Rate 
From Employees E join 
Departments d on e.DepatmentId = d.DepatmentId 

select * from Mean(@Numbers) 

Mise à jour: Sur la base de vos commentaires

Créer une nouveau table type.

CREATE TYPE Dept_number AS TABLE 
(
DepatmentId INT ,value numeric(22,6) 
); 

Alter la fonction

ALTER FUNCTION Mean(@dept_number DEPT_NUMBER readonly) 
returns TABLE 
AS 
    RETURN 
     (SELECT depatmentid, 
       mean = Sum(n.value)/Count(*) 
     FROM @dept_number n 
     GROUP BY depatmentid) 

appel de la fonction

DECLARE @dept_number DEPT_NUMBER 

INSERT INTO @dept_number 
      (depatmentid, 
      value) 
SELECT d.depatmentid, 
     e.rate 
FROM employees E 
     JOIN departments d 
     ON e.depatmentid = d.depatmentid 

SELECT * 
FROM Mean(@dept_number) 
+0

Mais cette requête retourne la valeur pour un seul département, donc je dois créer le curseur pour obtenir tous. – Artem

+0

@Artem - Non, nous passons la valeur de tous les départements. –

+0

Oh, je vois. Mais j'ai besoin d'un taux moyen pour chaque département séparément. – Artem