OVH Cloud OVH Cloud

Problème avec une fonction

9 réponses
Avatar
Evariste
Existe t-il un moyen de passer un nom de colonne, de table, voire de tri
comme paramètre d'une FONCTION.
J'ai bien essayé d'écrire ma requete en dynamique et de faire ensuite un
exec, mais il semble que l'exec ou execute n'est pas possible depuis une
fonction alors que je peux le faire dans une procédure stockée.
Merci d'avance pour votre aide.

9 réponses

Avatar
Patrice
Si la fonction retourne une table il est possible de l'appeler et de lui
appliquer le tri ensuite :
SELECT * FROM MaFonction() ORDER BY MonChamp

Si il faut aussi lui passer uin nom de table, cela supprime une bonne part
de l'intérêt des fonctions et procédures stockées (compilation). Dans ce
cas, autant générer peut-être du code SQL côté client ?

Patrice

--

"Evariste" a écrit dans le message de
news:
Existe t-il un moyen de passer un nom de colonne, de table, voire de tri
comme paramètre d'une FONCTION.
J'ai bien essayé d'écrire ma requete en dynamique et de faire ensuite un
exec, mais il semble que l'exec ou execute n'est pas possible depuis une
fonction alors que je peux le faire dans une procédure stockée.
Merci d'avance pour votre aide.


Avatar
Evariste
disons que l'intérêt n'était pas trop la performance mais la possibilité
d'avoir une seule fonction générique, plutot qu'une mutlitude de fonctions
faisant similairement la même chose.


"Patrice" a écrit :

Si la fonction retourne une table il est possible de l'appeler et de lui
appliquer le tri ensuite :
SELECT * FROM MaFonction() ORDER BY MonChamp

Si il faut aussi lui passer uin nom de table, cela supprime une bonne part
de l'intérêt des fonctions et procédures stockées (compilation). Dans ce
cas, autant générer peut-être du code SQL côté client ?

Patrice

--

"Evariste" a écrit dans le message de
news:
> Existe t-il un moyen de passer un nom de colonne, de table, voire de tri
> comme paramètre d'une FONCTION.
> J'ai bien essayé d'écrire ma requete en dynamique et de faire ensuite un
> exec, mais il semble que l'exec ou execute n'est pas possible depuis une
> fonction alors que je peux le faire dans une procédure stockée.
> Merci d'avance pour votre aide.





Avatar
Patrice
Je pense que le problème est que EXECUTE permettrait de modifier l'état de
la base ce qui n'est pas autorisé.

Que doit retourner cette fonction ?

Patrice

--

"Evariste" a écrit dans le message de
news:
disons que l'intérêt n'était pas trop la performance mais la possibilité
d'avoir une seule fonction générique, plutot qu'une mutlitude de fonctions
faisant similairement la même chose.


"Patrice" a écrit :

> Si la fonction retourne une table il est possible de l'appeler et de lui
> appliquer le tri ensuite :
> SELECT * FROM MaFonction() ORDER BY MonChamp
>
> Si il faut aussi lui passer uin nom de table, cela supprime une bonne


part
> de l'intérêt des fonctions et procédures stockées (compilation). Dans ce
> cas, autant générer peut-être du code SQL côté client ?
>
> Patrice
>
> --
>
> "Evariste" a écrit dans le message


de
> news:
> > Existe t-il un moyen de passer un nom de colonne, de table, voire de


tri
> > comme paramètre d'une FONCTION.
> > J'ai bien essayé d'écrire ma requete en dynamique et de faire ensuite


un
> > exec, mais il semble que l'exec ou execute n'est pas possible depuis


une
> > fonction alors que je peux le faire dans une procédure stockée.
> > Merci d'avance pour votre aide.
>
>
>


Avatar
Evariste
Par exemple, j'ai une table contrat et une table des contractants
et je veux faire select nocontrant, dbo.concatContractant(idcontrat) from
contrat

ou la fonction dbo.concatContractant renvoie la concaténation des
contractants.

Je peux toujours le faire dans le code de l'appli, mais ca serait beaucoup
mieux, si je pouvais le faire depuis une fonction.
Et comme j'ai plusieurs tables liés du meme type, je préfererai également
une fonction ou je peux passer la table lié, et le champ à concaténer plutot
que d'écrire une fonction par type de concaténation.

Merci d'avance.

"Patrice" a écrit :

Je pense que le problème est que EXECUTE permettrait de modifier l'état de
la base ce qui n'est pas autorisé.

Que doit retourner cette fonction ?

Patrice

--

"Evariste" a écrit dans le message de
news:
> disons que l'intérêt n'était pas trop la performance mais la possibilité
> d'avoir une seule fonction générique, plutot qu'une mutlitude de fonctions
> faisant similairement la même chose.
>
>
> "Patrice" a écrit :
>
> > Si la fonction retourne une table il est possible de l'appeler et de lui
> > appliquer le tri ensuite :
> > SELECT * FROM MaFonction() ORDER BY MonChamp
> >
> > Si il faut aussi lui passer uin nom de table, cela supprime une bonne
part
> > de l'intérêt des fonctions et procédures stockées (compilation). Dans ce
> > cas, autant générer peut-être du code SQL côté client ?
> >
> > Patrice
> >
> > --
> >
> > "Evariste" a écrit dans le message
de
> > news:
> > > Existe t-il un moyen de passer un nom de colonne, de table, voire de
tri
> > > comme paramètre d'une FONCTION.
> > > J'ai bien essayé d'écrire ma requete en dynamique et de faire ensuite
un
> > > exec, mais il semble que l'exec ou execute n'est pas possible depuis
une
> > > fonction alors que je peux le faire dans une procédure stockée.
> > > Merci d'avance pour votre aide.
> >
> >
> >





Avatar
Patrice
Pour l'instant je ne vois pas mieux que de tester les paramètres dans la
fonction pour créer le curseur correspondant ce qui permet ensuite au reste
de la fonction d'utiliser ce curseur quel qu'il soit. Cela devrait permettre
d'avoir une seule fonction mais la fonction devra prévoir chaque combinaison
"table", "colonne" possible...

Compare peut-être tout de même avec ce que cela donnerait côté client
(notamment cela soit doit être plutôt simple à faire dans une appli Web).

Patrice

--

"Evariste" a écrit dans le message de
news:
Par exemple, j'ai une table contrat et une table des contractants
et je veux faire select nocontrant, dbo.concatContractant(idcontrat) from
contrat

ou la fonction dbo.concatContractant renvoie la concaténation des
contractants.

Je peux toujours le faire dans le code de l'appli, mais ca serait beaucoup
mieux, si je pouvais le faire depuis une fonction.
Et comme j'ai plusieurs tables liés du meme type, je préfererai également
une fonction ou je peux passer la table lié, et le champ à concaténer


plutot
que d'écrire une fonction par type de concaténation.

Merci d'avance.

"Patrice" a écrit :

> Je pense que le problème est que EXECUTE permettrait de modifier l'état


de
> la base ce qui n'est pas autorisé.
>
> Que doit retourner cette fonction ?
>
> Patrice
>
> --
>
> "Evariste" a écrit dans le message


de
> news:
> > disons que l'intérêt n'était pas trop la performance mais la


possibilité
> > d'avoir une seule fonction générique, plutot qu'une mutlitude de


fonctions
> > faisant similairement la même chose.
> >
> >
> > "Patrice" a écrit :
> >
> > > Si la fonction retourne une table il est possible de l'appeler et de


lui
> > > appliquer le tri ensuite :
> > > SELECT * FROM MaFonction() ORDER BY MonChamp
> > >
> > > Si il faut aussi lui passer uin nom de table, cela supprime une


bonne
> part
> > > de l'intérêt des fonctions et procédures stockées (compilation).


Dans ce
> > > cas, autant générer peut-être du code SQL côté client ?
> > >
> > > Patrice
> > >
> > > --
> > >
> > > "Evariste" a écrit dans le


message
> de
> > > news:
> > > > Existe t-il un moyen de passer un nom de colonne, de table, voire


de
> tri
> > > > comme paramètre d'une FONCTION.
> > > > J'ai bien essayé d'écrire ma requete en dynamique et de faire


ensuite
> un
> > > > exec, mais il semble que l'exec ou execute n'est pas possible


depuis
> une
> > > > fonction alors que je peux le faire dans une procédure stockée.
> > > > Merci d'avance pour votre aide.
> > >
> > >
> > >
>
>
>


Avatar
Evariste
Merci pour ton aide, j'ai cependant une derniere question sur le sujet.
Via l'analyseur de requete sur la base master, je vois dans les procédure
stockées étendues la procédure stockée sp_executeSQL, j'ai donc tenté de
l'appeler depuis ma fonction. Je compile sans problème mais à l'execution de
ma fonction j'ai le message suivant :

"Seules les fonctions et les procédures étendues peuvent être exécutées à
partir d'une fonction."

"Patrice" a écrit :

Pour l'instant je ne vois pas mieux que de tester les paramètres dans la
fonction pour créer le curseur correspondant ce qui permet ensuite au reste
de la fonction d'utiliser ce curseur quel qu'il soit. Cela devrait permettre
d'avoir une seule fonction mais la fonction devra prévoir chaque combinaison
"table", "colonne" possible...

Compare peut-être tout de même avec ce que cela donnerait côté client
(notamment cela soit doit être plutôt simple à faire dans une appli Web).

Patrice

--

"Evariste" a écrit dans le message de
news:
> Par exemple, j'ai une table contrat et une table des contractants
> et je veux faire select nocontrant, dbo.concatContractant(idcontrat) from
> contrat
>
> ou la fonction dbo.concatContractant renvoie la concaténation des
> contractants.
>
> Je peux toujours le faire dans le code de l'appli, mais ca serait beaucoup
> mieux, si je pouvais le faire depuis une fonction.
> Et comme j'ai plusieurs tables liés du meme type, je préfererai également
> une fonction ou je peux passer la table lié, et le champ à concaténer
plutot
> que d'écrire une fonction par type de concaténation.
>
> Merci d'avance.
>
> "Patrice" a écrit :
>
> > Je pense que le problème est que EXECUTE permettrait de modifier l'état
de
> > la base ce qui n'est pas autorisé.
> >
> > Que doit retourner cette fonction ?
> >
> > Patrice
> >
> > --
> >
> > "Evariste" a écrit dans le message
de
> > news:
> > > disons que l'intérêt n'était pas trop la performance mais la
possibilité
> > > d'avoir une seule fonction générique, plutot qu'une mutlitude de
fonctions
> > > faisant similairement la même chose.
> > >
> > >
> > > "Patrice" a écrit :
> > >
> > > > Si la fonction retourne une table il est possible de l'appeler et de
lui
> > > > appliquer le tri ensuite :
> > > > SELECT * FROM MaFonction() ORDER BY MonChamp
> > > >
> > > > Si il faut aussi lui passer uin nom de table, cela supprime une
bonne
> > part
> > > > de l'intérêt des fonctions et procédures stockées (compilation).
Dans ce
> > > > cas, autant générer peut-être du code SQL côté client ?
> > > >
> > > > Patrice
> > > >
> > > > --
> > > >
> > > > "Evariste" a écrit dans le
message
> > de
> > > > news:
> > > > > Existe t-il un moyen de passer un nom de colonne, de table, voire
de
> > tri
> > > > > comme paramètre d'une FONCTION.
> > > > > J'ai bien essayé d'écrire ma requete en dynamique et de faire
ensuite
> > un
> > > > > exec, mais il semble que l'exec ou execute n'est pas possible
depuis
> > une
> > > > > fonction alors que je peux le faire dans une procédure stockée.
> > > > > Merci d'avance pour votre aide.
> > > >
> > > >
> > > >
> >
> >
> >





Avatar
Patrice
D'après la doc :
Les instructions suivantes sont autorisées dans le corps d'une fonction
multi-instructions. Les instructions ne figurant pas dans la liste suivante
ne sont pas autorisées dans le corps d'une fonction :

a.. Instructions d'affectation


b.. les instructions de contrôle de flux ;


c.. Instructions DECLARE définissant des curseurs et des variables de
données locaux à la fonction


d.. Instructions SELECT contenant des listes de sélection avec des
expressions qui affectent des valeurs à des variables locales à la fonction


e.. Opérations de curseur faisant référence à des curseurs locaux
déclarés, ouverts, fermés et désalloués dans la fonction. Seules les
instructions FETCH affectant des valeurs aux variables locales à l'aide de
la clause INTO sont autorisées ; les instructions FETCH qui renvoient des
données au client ne sont pas autorisées.


f.. Instructions INSERT, UPDATE et DELETE modifiant les variables table
locales à la fonction


g.. Instructions EXECUTE appelant des procédures stockées étendues

--

"Evariste" a écrit dans le message de
news:
Merci pour ton aide, j'ai cependant une derniere question sur le sujet.
Via l'analyseur de requete sur la base master, je vois dans les procédure
stockées étendues la procédure stockée sp_executeSQL, j'ai donc tenté de
l'appeler depuis ma fonction. Je compile sans problème mais à l'execution


de
ma fonction j'ai le message suivant :

"Seules les fonctions et les procédures étendues peuvent être exécutées à
partir d'une fonction."

"Patrice" a écrit :

> Pour l'instant je ne vois pas mieux que de tester les paramètres dans la
> fonction pour créer le curseur correspondant ce qui permet ensuite au


reste
> de la fonction d'utiliser ce curseur quel qu'il soit. Cela devrait


permettre
> d'avoir une seule fonction mais la fonction devra prévoir chaque


combinaison
> "table", "colonne" possible...
>
> Compare peut-être tout de même avec ce que cela donnerait côté client
> (notamment cela soit doit être plutôt simple à faire dans une appli


Web).
>
> Patrice
>
> --
>
> "Evariste" a écrit dans le message


de
> news:
> > Par exemple, j'ai une table contrat et une table des contractants
> > et je veux faire select nocontrant, dbo.concatContractant(idcontrat)


from
> > contrat
> >
> > ou la fonction dbo.concatContractant renvoie la concaténation des
> > contractants.
> >
> > Je peux toujours le faire dans le code de l'appli, mais ca serait


beaucoup
> > mieux, si je pouvais le faire depuis une fonction.
> > Et comme j'ai plusieurs tables liés du meme type, je préfererai


également
> > une fonction ou je peux passer la table lié, et le champ à concaténer
> plutot
> > que d'écrire une fonction par type de concaténation.
> >
> > Merci d'avance.
> >
> > "Patrice" a écrit :
> >
> > > Je pense que le problème est que EXECUTE permettrait de modifier


l'état
> de
> > > la base ce qui n'est pas autorisé.
> > >
> > > Que doit retourner cette fonction ?
> > >
> > > Patrice
> > >
> > > --
> > >
> > > "Evariste" a écrit dans le


message
> de
> > > news:
> > > > disons que l'intérêt n'était pas trop la performance mais la
> possibilité
> > > > d'avoir une seule fonction générique, plutot qu'une mutlitude de
> fonctions
> > > > faisant similairement la même chose.
> > > >
> > > >
> > > > "Patrice" a écrit :
> > > >
> > > > > Si la fonction retourne une table il est possible de l'appeler


et de
> lui
> > > > > appliquer le tri ensuite :
> > > > > SELECT * FROM MaFonction() ORDER BY MonChamp
> > > > >
> > > > > Si il faut aussi lui passer uin nom de table, cela supprime une
> bonne
> > > part
> > > > > de l'intérêt des fonctions et procédures stockées (compilation).
> Dans ce
> > > > > cas, autant générer peut-être du code SQL côté client ?
> > > > >
> > > > > Patrice
> > > > >
> > > > > --
> > > > >
> > > > > "Evariste" a écrit dans le
> message
> > > de
> > > > > news:
> > > > > > Existe t-il un moyen de passer un nom de colonne, de table,


voire
> de
> > > tri
> > > > > > comme paramètre d'une FONCTION.
> > > > > > J'ai bien essayé d'écrire ma requete en dynamique et de faire
> ensuite
> > > un
> > > > > > exec, mais il semble que l'exec ou execute n'est pas possible
> depuis
> > > une
> > > > > > fonction alors que je peux le faire dans une procédure


stockée.
> > > > > > Merci d'avance pour votre aide.
> > > > >
> > > > >
> > > > >
> > >
> > >
> > >
>
>
>


Avatar
Evariste
Mais dans la coc on a également :
Appel de procédures stockées étendues à partir des fonctions
Une procédure stockée étendue appelée à partir d'une fonction ne peut pas
renvoyer de jeux de résultats au client. Les API ODS qui renvoient des jeux
de résultats au client renvoient FAIL. La procédure stockée étendue peut se
reconnecter à Microsoft® SQL Server™ ; toutefois, elle ne doit pas rejoindre
la même transaction que la fonction l'ayant appelée.

Et comme ce qui m'interesse, c'est de retourner un résultat, j'ai plus qu'a
aller dormir.
Merci pour toutes les infos.



"Patrice" a écrit :

D'après la doc :
Les instructions suivantes sont autorisées dans le corps d'une fonction
multi-instructions. Les instructions ne figurant pas dans la liste suivante
ne sont pas autorisées dans le corps d'une fonction :

a.. Instructions d'affectation


b.. les instructions de contrôle de flux ;


c.. Instructions DECLARE définissant des curseurs et des variables de
données locaux à la fonction


d.. Instructions SELECT contenant des listes de sélection avec des
expressions qui affectent des valeurs à des variables locales à la fonction


e.. Opérations de curseur faisant référence à des curseurs locaux
déclarés, ouverts, fermés et désalloués dans la fonction. Seules les
instructions FETCH affectant des valeurs aux variables locales à l'aide de
la clause INTO sont autorisées ; les instructions FETCH qui renvoient des
données au client ne sont pas autorisées.


f.. Instructions INSERT, UPDATE et DELETE modifiant les variables table
locales à la fonction


g.. Instructions EXECUTE appelant des procédures stockées étendues

--

"Evariste" a écrit dans le message de
news:
> Merci pour ton aide, j'ai cependant une derniere question sur le sujet.
> Via l'analyseur de requete sur la base master, je vois dans les procédure
> stockées étendues la procédure stockée sp_executeSQL, j'ai donc tenté de
> l'appeler depuis ma fonction. Je compile sans problème mais à l'execution
de
> ma fonction j'ai le message suivant :
>
> "Seules les fonctions et les procédures étendues peuvent être exécutées à
> partir d'une fonction."
>
> "Patrice" a écrit :
>
> > Pour l'instant je ne vois pas mieux que de tester les paramètres dans la
> > fonction pour créer le curseur correspondant ce qui permet ensuite au
reste
> > de la fonction d'utiliser ce curseur quel qu'il soit. Cela devrait
permettre
> > d'avoir une seule fonction mais la fonction devra prévoir chaque
combinaison
> > "table", "colonne" possible...
> >
> > Compare peut-être tout de même avec ce que cela donnerait côté client
> > (notamment cela soit doit être plutôt simple à faire dans une appli
Web).
> >
> > Patrice
> >
> > --
> >
> > "Evariste" a écrit dans le message
de
> > news:
> > > Par exemple, j'ai une table contrat et une table des contractants
> > > et je veux faire select nocontrant, dbo.concatContractant(idcontrat)
from
> > > contrat
> > >
> > > ou la fonction dbo.concatContractant renvoie la concaténation des
> > > contractants.
> > >
> > > Je peux toujours le faire dans le code de l'appli, mais ca serait
beaucoup
> > > mieux, si je pouvais le faire depuis une fonction.
> > > Et comme j'ai plusieurs tables liés du meme type, je préfererai
également
> > > une fonction ou je peux passer la table lié, et le champ à concaténer
> > plutot
> > > que d'écrire une fonction par type de concaténation.
> > >
> > > Merci d'avance.
> > >
> > > "Patrice" a écrit :
> > >
> > > > Je pense que le problème est que EXECUTE permettrait de modifier
l'état
> > de
> > > > la base ce qui n'est pas autorisé.
> > > >
> > > > Que doit retourner cette fonction ?
> > > >
> > > > Patrice
> > > >
> > > > --
> > > >
> > > > "Evariste" a écrit dans le
message
> > de
> > > > news:
> > > > > disons que l'intérêt n'était pas trop la performance mais la
> > possibilité
> > > > > d'avoir une seule fonction générique, plutot qu'une mutlitude de
> > fonctions
> > > > > faisant similairement la même chose.
> > > > >
> > > > >
> > > > > "Patrice" a écrit :
> > > > >
> > > > > > Si la fonction retourne une table il est possible de l'appeler
et de
> > lui
> > > > > > appliquer le tri ensuite :
> > > > > > SELECT * FROM MaFonction() ORDER BY MonChamp
> > > > > >
> > > > > > Si il faut aussi lui passer uin nom de table, cela supprime une
> > bonne
> > > > part
> > > > > > de l'intérêt des fonctions et procédures stockées (compilation).
> > Dans ce
> > > > > > cas, autant générer peut-être du code SQL côté client ?
> > > > > >
> > > > > > Patrice
> > > > > >
> > > > > > --
> > > > > >
> > > > > > "Evariste" a écrit dans le
> > message
> > > > de
> > > > > > news:
> > > > > > > Existe t-il un moyen de passer un nom de colonne, de table,
voire
> > de
> > > > tri
> > > > > > > comme paramètre d'une FONCTION.
> > > > > > > J'ai bien essayé d'écrire ma requete en dynamique et de faire
> > ensuite
> > > > un
> > > > > > > exec, mais il semble que l'exec ou execute n'est pas possible
> > depuis
> > > > une
> > > > > > > fonction alors que je peux le faire dans une procédure
stockée.
> > > > > > > Merci d'avance pour votre aide.
> > > > > >
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> >
> >
> >





Avatar
Patrice
Oui donc on retombe par exemple, si tu veux le faire dans une fonction sur
le test des paramètres pour créeer un curseur qui sera ensuite manipé dans
la fonction :

If @Table_Name='..' AND @Column_Name DECLARE cu CURSOR FOR ...
If @Table_Name='..' AND @Column_Name DECLARE cu CURSOR FOR ...
If @Table_Name='..' AND @Column_Name DECLARE cu CURSOR FOR ...
If @Table_Name='..' AND @Column_Name DECLARE cu CURSOR FOR ...
-- Ensuite la fonction traire le curseur toujours de la même façon quelle
que soit les données qui lui correspondent....

Dors bien ;-)

Patrice

--

"Evariste" a écrit dans le message de
news:
Mais dans la coc on a également :
Appel de procédures stockées étendues à partir des fonctions
Une procédure stockée étendue appelée à partir d'une fonction ne peut pas
renvoyer de jeux de résultats au client. Les API ODS qui renvoient des


jeux
de résultats au client renvoient FAIL. La procédure stockée étendue peut


se
reconnecter à Microsoft® SQL ServerT ; toutefois, elle ne doit pas


rejoindre
la même transaction que la fonction l'ayant appelée.

Et comme ce qui m'interesse, c'est de retourner un résultat, j'ai plus


qu'a
aller dormir.
Merci pour toutes les infos.



"Patrice" a écrit :

> D'après la doc :
> Les instructions suivantes sont autorisées dans le corps d'une fonction
> multi-instructions. Les instructions ne figurant pas dans la liste


suivante
> ne sont pas autorisées dans le corps d'une fonction :
>
> a.. Instructions d'affectation
>
>
> b.. les instructions de contrôle de flux ;
>
>
> c.. Instructions DECLARE définissant des curseurs et des variables de
> données locaux à la fonction
>
>
> d.. Instructions SELECT contenant des listes de sélection avec des
> expressions qui affectent des valeurs à des variables locales à la


fonction
>
>
> e.. Opérations de curseur faisant référence à des curseurs locaux
> déclarés, ouverts, fermés et désalloués dans la fonction. Seules les
> instructions FETCH affectant des valeurs aux variables locales à l'aide


de
> la clause INTO sont autorisées ; les instructions FETCH qui renvoient


des
> données au client ne sont pas autorisées.
>
>
> f.. Instructions INSERT, UPDATE et DELETE modifiant les variables


table
> locales à la fonction
>
>
> g.. Instructions EXECUTE appelant des procédures stockées étendues
>
> --
>
> "Evariste" a écrit dans le message


de
> news:
> > Merci pour ton aide, j'ai cependant une derniere question sur le


sujet.
> > Via l'analyseur de requete sur la base master, je vois dans les


procédure
> > stockées étendues la procédure stockée sp_executeSQL, j'ai donc tenté


de
> > l'appeler depuis ma fonction. Je compile sans problème mais à


l'execution
> de
> > ma fonction j'ai le message suivant :
> >
> > "Seules les fonctions et les procédures étendues peuvent être


exécutées à
> > partir d'une fonction."
> >
> > "Patrice" a écrit :
> >
> > > Pour l'instant je ne vois pas mieux que de tester les paramètres


dans la
> > > fonction pour créer le curseur correspondant ce qui permet ensuite


au
> reste
> > > de la fonction d'utiliser ce curseur quel qu'il soit. Cela devrait
> permettre
> > > d'avoir une seule fonction mais la fonction devra prévoir chaque
> combinaison
> > > "table", "colonne" possible...
> > >
> > > Compare peut-être tout de même avec ce que cela donnerait côté


client
> > > (notamment cela soit doit être plutôt simple à faire dans une appli
> Web).
> > >
> > > Patrice
> > >
> > > --
> > >
> > > "Evariste" a écrit dans le


message
> de
> > > news:
> > > > Par exemple, j'ai une table contrat et une table des contractants
> > > > et je veux faire select nocontrant,


dbo.concatContractant(idcontrat)
> from
> > > > contrat
> > > >
> > > > ou la fonction dbo.concatContractant renvoie la concaténation des
> > > > contractants.
> > > >
> > > > Je peux toujours le faire dans le code de l'appli, mais ca serait
> beaucoup
> > > > mieux, si je pouvais le faire depuis une fonction.
> > > > Et comme j'ai plusieurs tables liés du meme type, je préfererai
> également
> > > > une fonction ou je peux passer la table lié, et le champ à


concaténer
> > > plutot
> > > > que d'écrire une fonction par type de concaténation.
> > > >
> > > > Merci d'avance.
> > > >
> > > > "Patrice" a écrit :
> > > >
> > > > > Je pense que le problème est que EXECUTE permettrait de modifier
> l'état
> > > de
> > > > > la base ce qui n'est pas autorisé.
> > > > >
> > > > > Que doit retourner cette fonction ?
> > > > >
> > > > > Patrice
> > > > >
> > > > > --
> > > > >
> > > > > "Evariste" a écrit dans le
> message
> > > de
> > > > > news:
> > > > > > disons que l'intérêt n'était pas trop la performance mais la
> > > possibilité
> > > > > > d'avoir une seule fonction générique, plutot qu'une mutlitude


de
> > > fonctions
> > > > > > faisant similairement la même chose.
> > > > > >
> > > > > >
> > > > > > "Patrice" a écrit :
> > > > > >
> > > > > > > Si la fonction retourne une table il est possible de


l'appeler
> et de
> > > lui
> > > > > > > appliquer le tri ensuite :
> > > > > > > SELECT * FROM MaFonction() ORDER BY MonChamp
> > > > > > >
> > > > > > > Si il faut aussi lui passer uin nom de table, cela supprime


une
> > > bonne
> > > > > part
> > > > > > > de l'intérêt des fonctions et procédures stockées


(compilation).
> > > Dans ce
> > > > > > > cas, autant générer peut-être du code SQL côté client ?
> > > > > > >
> > > > > > > Patrice
> > > > > > >
> > > > > > > --
> > > > > > >
> > > > > > > "Evariste" a écrit dans


le
> > > message
> > > > > de
> > > > > > > news:
> > > > > > > > Existe t-il un moyen de passer un nom de colonne, de


table,
> voire
> > > de
> > > > > tri
> > > > > > > > comme paramètre d'une FONCTION.
> > > > > > > > J'ai bien essayé d'écrire ma requete en dynamique et de


faire
> > > ensuite
> > > > > un
> > > > > > > > exec, mais il semble que l'exec ou execute n'est pas


possible
> > > depuis
> > > > > une
> > > > > > > > fonction alors que je peux le faire dans une procédure
> stockée.
> > > > > > > > Merci d'avance pour votre aide.
> > > > > > >
> > > > > > >
> > > > > > >
> > > > >
> > > > >
> > > > >
> > >
> > >
> > >
>
>
>