OVH Cloud OVH Cloud

Pb Fonctions utilisateurs

4 réponses
Avatar
frederic.facca
Salut à tous.
J'ai crée la fonction utilisateur suivante dans ma base.

CREATE FUNCTION dbo.LibelleClient (@IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE
@Lib varchar(200)
SET @Lib = ( SELECT Libelle FROM CLIENT WHERE IdClientName = @IdValue )
RETURN @Lib
END

Cette fonction renvoie le champ libelle d'un client lorsqu'on connait sa
clé.
Elle marche parfaitement, et je m'en sers trés souvent.

J'ai besoin d'utiliser la même fonction mais pour une table.
J'essaie de créer la fonction LibelleGlobal qui me semble être correcte mais
que je n'arrive pas à valider car j'ai le message suivant :
Erreur 137 : la variable @TableName doit être déclarée.

CREATE FUNCTION dbo.LibelleGlobal (@TableName varchar(50), @IdName
varchar(50), @IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE
@Lib varchar(200)
SET @Lib=''
SET @Lib = ( SELECT Libelle FROM @TableName WHERE @IdName = @IdValue )
RETURN @Lib
END

Si quelqu'un pourrait m'aider à faire une fonction plus général comme je le
souhaite, je le remercie d'avance.

Frédéric.

4 réponses

Avatar
Fred BROUARD
Il n'est pas possible de passer en paramétre de requête un nom de table
de colonne etc...

En revanche tu peut faire cela dans du SQL Dynamique

Quelque chose comme :

CREATE FUNCTION LibelleGlobal (@TableName varchar(50),
@IdName varchar(50),
@IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE @Lib varchar(200)
DECLARE @query varchar(8000)
SET @query = 'SELECT @Lib = Libelle FROM ' + @TableName
+ ' WHERE '+ @IdName + ' = '+ @IdValue
EXEC (@query)
RETURN @Lib
END

A +

frederic.facca a écrit:
Salut à tous.
J'ai crée la fonction utilisateur suivante dans ma base.

CREATE FUNCTION dbo.LibelleClient (@IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE
@Lib varchar(200)
SET @Lib = ( SELECT Libelle FROM CLIENT WHERE IdClientName = @IdValue )
RETURN @Lib
END

Cette fonction renvoie le champ libelle d'un client lorsqu'on connait sa
clé.
Elle marche parfaitement, et je m'en sers trés souvent.

J'ai besoin d'utiliser la même fonction mais pour une table.
J'essaie de créer la fonction LibelleGlobal qui me semble être correcte mais
que je n'arrive pas à valider car j'ai le message suivant :
Erreur 137 : la variable @TableName doit être déclarée.



> CREATE FUNCTION dbo.LibelleGlobal (@TableName varchar(50), @IdName
> varchar(50), @IdValue int)
> RETURNS varchar(200)
> AS
> BEGIN
> DECLARE
> @Lib varchar(200)
> SET @Lib=''
> SET @Lib = ( SELECT Libelle FROM @TableName WHERE @IdName = @IdValue )
> RETURN @Lib
> END

Si quelqu'un pourrait m'aider à faire une fonction plus général comme je le
souhaite, je le remercie d'avance.

Frédéric.





--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
Frédéric
Cher Fred, merci beaucoup pour ton aide.
Cependant la fonction que tu m'as fourni ne fonctionne pas correctement.

Voici la fonction utilisateur que j'ai défini dans ma base de données :
CREATE FUNCTION LibelleGlobal (@TableName varchar(50), @IdName
varchar(50), @IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE @Lib varchar(200)
DECLARE @query varchar(8000)
SET @query = 'SELECT @Lib = Libelle FROM ' + @TableName + ' WHERE '+
@IdName + ' = '+ @IdValue
EXEC @query
RETURN @Lib
END

Maintenant lorsque je lance la requete suivante dans l'analyseur de requete
:
SELECT IdClient, dbo.LibelleGlobal('CLIENT', 'IdClient', IdClient) FROM
CLIENT WHERE IdClient < 100
j'obtiens le message d'erreur suivant :
Serveur : Msg 245, Niveau 16, État 1, Procédure LibelleGlobal, Ligne 7
Erreur de syntaxe lors de la conversion de la valeur varchar 'SELECT @Lib Libelle FROM AUTEUR WHERE IdCLIENT = ' vers une colonne de type de données
int.

J'ai même essayé d'écrire en dure dans la fonction, la requete SQL (ex : SET
query = 'SELECT @Lib = Libelle FROM CLIENT WHERE IdClient 0' )
Là, j'obtiens le message d'erreur suivant :
Serveur : Msg 2812, Niveau 16, État 62, Procédure LibelleGlobal, Ligne 9
Impossible de trouver la procédure stockée 'SELECT @Lib = Libelle FROM
CLIENT WHERE IdClient 0'.

Si tu pouvais m'apporter encore ton aide, je t'en serais trés reconnaissant.
Merci beaucoup.

Frédéric.


"Fred BROUARD" a écrit dans le message de
news:
Il n'est pas possible de passer en paramétre de requête un nom de table
de colonne etc...

En revanche tu peut faire cela dans du SQL Dynamique

Quelque chose comme :

CREATE FUNCTION LibelleGlobal (@TableName varchar(50),
@IdName varchar(50),
@IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE @Lib varchar(200)
DECLARE @query varchar(8000)
SET @query = 'SELECT @Lib = Libelle FROM ' + @TableName
+ ' WHERE '+ @IdName + ' = '+ @IdValue
EXEC (@query)
RETURN @Lib
END

A +

frederic.facca a écrit:
> Salut à tous.
> J'ai crée la fonction utilisateur suivante dans ma base.
>
> CREATE FUNCTION dbo.LibelleClient (@IdValue int)
> RETURNS varchar(200)
> AS
> BEGIN
> DECLARE
> @Lib varchar(200)
> SET @Lib = ( SELECT Libelle FROM CLIENT WHERE IdClientName = @IdValue )
> RETURN @Lib
> END
>
> Cette fonction renvoie le champ libelle d'un client lorsqu'on connait sa
> clé.
> Elle marche parfaitement, et je m'en sers trés souvent.
>
> J'ai besoin d'utiliser la même fonction mais pour une table.
> J'essaie de créer la fonction LibelleGlobal qui me semble être correcte


mais
> que je n'arrive pas à valider car j'ai le message suivant :
> Erreur 137 : la variable @TableName doit être déclarée.
>
> CREATE FUNCTION dbo.LibelleGlobal (@TableName varchar(50), @IdName
> varchar(50), @IdValue int)
> RETURNS varchar(200)
> AS
> BEGIN
> DECLARE
> @Lib varchar(200)
> SET @Lib=''
> SET @Lib = ( SELECT Libelle FROM @TableName WHERE @IdName = @IdValue )
> RETURN @Lib
> END
>
> Si quelqu'un pourrait m'aider à faire une fonction plus général comme je


le
> souhaite, je le remercie d'avance.
>
> Frédéric.
>
>

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************



Avatar
Med Bouchenafa[MVP]
Je ne suis pas certain qu'il puisse utilise du SQL dynamique à l'intérieur
d'une fonction.

--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris

"Fred BROUARD" wrote in message
news:
Il n'est pas possible de passer en paramétre de requête un nom de table
de colonne etc...

En revanche tu peut faire cela dans du SQL Dynamique

Quelque chose comme :

CREATE FUNCTION LibelleGlobal (@TableName varchar(50),
@IdName varchar(50),
@IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE @Lib varchar(200)
DECLARE @query varchar(8000)
SET @query = 'SELECT @Lib = Libelle FROM ' + @TableName
+ ' WHERE '+ @IdName + ' = '+ @IdValue
EXEC (@query)
RETURN @Lib
END

A +

frederic.facca a écrit:
> Salut à tous.
> J'ai crée la fonction utilisateur suivante dans ma base.
>
> CREATE FUNCTION dbo.LibelleClient (@IdValue int)
> RETURNS varchar(200)
> AS
> BEGIN
> DECLARE
> @Lib varchar(200)
> SET @Lib = ( SELECT Libelle FROM CLIENT WHERE IdClientName = @IdValue )
> RETURN @Lib
> END
>
> Cette fonction renvoie le champ libelle d'un client lorsqu'on connait sa
> clé.
> Elle marche parfaitement, et je m'en sers trés souvent.
>
> J'ai besoin d'utiliser la même fonction mais pour une table.
> J'essaie de créer la fonction LibelleGlobal qui me semble être correcte


mais
> que je n'arrive pas à valider car j'ai le message suivant :
> Erreur 137 : la variable @TableName doit être déclarée.
>
> CREATE FUNCTION dbo.LibelleGlobal (@TableName varchar(50), @IdName
> varchar(50), @IdValue int)
> RETURNS varchar(200)
> AS
> BEGIN
> DECLARE
> @Lib varchar(200)
> SET @Lib=''
> SET @Lib = ( SELECT Libelle FROM @TableName WHERE @IdName = @IdValue )
> RETURN @Lib
> END
>
> Si quelqu'un pourrait m'aider à faire une fonction plus général comme je


le
> souhaite, je le remercie d'avance.
>
> Frédéric.
>
>

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************



Avatar
frederic.facca
Cher Fred, merci beaucoup pour ton aide.
Cependant la fonction que tu m'as fourni ne fonctionne pas correctement.

Voici la fonction utilisateur que j'ai défini dans ma base de données :
CREATE FUNCTION LibelleGlobal (@TableName varchar(50), @IdName
varchar(50), @IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE @Lib varchar(200)
DECLARE @query varchar(8000)
SET @query = 'SELECT @Lib = Libelle FROM ' + @TableName + ' WHERE '+
@IdName + ' = '+ @IdValue
EXEC @query
RETURN @Lib
END

Maintenant lorsque je lance la requete suivante dans l'analyseur de requete
:
SELECT IdClient, dbo.LibelleGlobal('CLIENT', 'IdClient', IdClient) FROM
CLIENT WHERE IdClient < 100
j'obtiens le message d'erreur suivant :
Serveur : Msg 245, Niveau 16, État 1, Procédure LibelleGlobal, Ligne 7
Erreur de syntaxe lors de la conversion de la valeur varchar 'SELECT @Lib Libelle FROM AUTEUR WHERE IdCLIENT = ' vers une colonne de type de données
int.

J'ai même essayé d'écrire en dure dans la fonction, la requete SQL (ex : SET
query = 'SELECT @Lib = Libelle FROM CLIENT WHERE IdClient 0' )
Là, j'obtiens le message d'erreur suivant :
Serveur : Msg 2812, Niveau 16, État 62, Procédure LibelleGlobal, Ligne 9
Impossible de trouver la procédure stockée 'SELECT @Lib = Libelle FROM
CLIENT WHERE IdClient 0'.

Si tu pouvais m'apporter encore ton aide, je t'en serais trés reconnaissant.
Merci beaucoup.

Frédéric.

"Fred BROUARD" a écrit dans le message de news:

Il n'est pas possible de passer en paramétre de requête un nom de table
de colonne etc...

En revanche tu peut faire cela dans du SQL Dynamique

Quelque chose comme :

CREATE FUNCTION LibelleGlobal (@TableName varchar(50),
@IdName varchar(50),
@IdValue int)
RETURNS varchar(200)
AS
BEGIN
DECLARE @Lib varchar(200)
DECLARE @query varchar(8000)
SET @query = 'SELECT @Lib = Libelle FROM ' + @TableName
+ ' WHERE '+ @IdName + ' = '+ @IdValue
EXEC (@query)
RETURN @Lib
END

A +

frederic.facca a écrit:
> Salut à tous.
> J'ai crée la fonction utilisateur suivante dans ma base.
>
> CREATE FUNCTION dbo.LibelleClient (@IdValue int)
> RETURNS varchar(200)
> AS
> BEGIN
> DECLARE
> @Lib varchar(200)
> SET @Lib = ( SELECT Libelle FROM CLIENT WHERE IdClientName = @IdValue )
> RETURN @Lib
> END
>
> Cette fonction renvoie le champ libelle d'un client lorsqu'on connait sa
> clé.
> Elle marche parfaitement, et je m'en sers trés souvent.
>
> J'ai besoin d'utiliser la même fonction mais pour une table.
> J'essaie de créer la fonction LibelleGlobal qui me semble être correcte


mais
> que je n'arrive pas à valider car j'ai le message suivant :
> Erreur 137 : la variable @TableName doit être déclarée.
>
> CREATE FUNCTION dbo.LibelleGlobal (@TableName varchar(50), @IdName
> varchar(50), @IdValue int)
> RETURNS varchar(200)
> AS
> BEGIN
> DECLARE
> @Lib varchar(200)
> SET @Lib=''
> SET @Lib = ( SELECT Libelle FROM @TableName WHERE @IdName = @IdValue )
> RETURN @Lib
> END
>
> Si quelqu'un pourrait m'aider à faire une fonction plus général comme je


le
> souhaite, je le remercie d'avance.
>
> Frédéric.
>
>

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************