Bonjour,

J'essaye de réaliser une fonction qui reçoit un paramètre table, et j'ai un message surprenant

voici un exemple :

Tout d'abord, créer un type Table et la fonction qui va recevoir ce type

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Create Type tbl_ListeProrata as TABLE
(
	Id		varchar(255)	not null,
	Montant	money		null
)
go
 
Create function dbo.fn_Prorata (@Liste as dbo.tbl_ListeProrata ReadOnly)
RETURNS @Result TABLE
(
	Id		varchar(255)	not null,
	Montant	money		null,
	Coeff	decimal(20,17)		null
)
AS BEGIN
	with Toto(Total) as 
	( Select Total = Sum(IsNull(Montant,0)) from @Liste)
 
	insert @Result
	Select L.Id, L.Montant, L.Montant/T.Total  
	from	@Liste as L, Toto as T
 
	RETURN
END
go
Puis le test
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
Create Table #Tata
(	IdTata	int not null,
	Montant	money null
)
 
Insert into #Tata Values( 1, 158.10)
Insert into #Tata Values( 2, 780.5)
Insert into #Tata Values( 3, 980.25)
Insert into #Tata Values( 4, 1980.25)
Insert into #Tata Values( 5, 1245)
 
Declare @AffListe as dbo.tbl_ListeProrata
 
Insert into @AffListe (Id,Montant)
Select Id = convert(varchar(255),IdTata), Montant = Montant from #Tata
 
Select *
from dbo.fn_Prorata(@AffListe)
Et Sql Server me répond :
La variable scalaire "@AffListe" doit être déclarée.
J'ai beau chercher, je ne vois pas où je faute ...

Et sur le net, outre Microsoft qui décrit les étapes pour y parvenir complété d'un exemple ... de procédure stocké, je n'ai trouvé que ça voir la réponse de Lukasz Lysik du Oct 22 '09 at 18:42

Son exemple tel quel fonctionne, dès que je le transforme pour que la fonction retourne une table, le message revient !

Est-ce à dire qu'une fonction qui reçoit une table ne peut pas en renvoyer elle même une ?