OVH Cloud OVH Cloud

Renvoi la requete au lieu de son résultat

2 réponses
Avatar
GrosseVache
Lors de la migration Oracle =3D> SQL Server, cette fonction
ne renvoie plus le r=E9sultat de la requete, mais la requete
elle-m=EAme.

Des id=E9es ?


IF EXISTS (SELECT *
FROM sysobjects
WHERE id =3D object_id('LIBELLE_LANGUE') AND type =3D 'FN')
DROP FUNCTION LIBELLE_LANGUE
GO
CREATE FUNCTION LIBELLE_LANGUE (
@table_normale VARCHAR(8000),
@table_langue VARCHAR(8000),
@colonne_libelle VARCHAR(8000),
@code_langue VARCHAR(8000),
@pk1_nom VARCHAR(8000),
@pk1_valeur INTEGER,
@pk2_nom VARCHAR(8000) =3D NULL,
@pk2_valeur INTEGER =3D NULL,
@pk3_nom VARCHAR(8000) =3D NULL,
@pk3_valeur INTEGER =3D NULL,
@pk4_nom VARCHAR(8000) =3D NULL,
@pk4_valeur INTEGER =3D NULL,
@pk5_nom VARCHAR(8000) =3D NULL,
@pk5_valeur INTEGER =3D NULL,
@pk6_nom VARCHAR(8000) =3D NULL,
@pk6_valeur INTEGER =3D NULL
)
RETURNS VARCHAR(8000)
AS

-- Cette fonction renvoie le libell=E9 de la colonne
"colonne_libelle" prise :
-- - dans la table "table_langue" si une ligne existe pour
la clef
-- primaire pass=E9e en param=E8tre avec le code langue
"code_langue".
-- - dans la table "table_normale" s'il n'y a pas de valeur
ad hoc
-- dans "table langue".
--=20
-- PRE-REQUIS :
-- - la clef primaire ne comporte pas plus de 6 colonnes
-- - la colonne code langue a pour nom VCH_LAN_CODE pour toutes
-- les tables de langue.
-- - toutes les autres colonnes de toutes les autres clefs
primaires
-- sont num=E9riques (sinon il faudrait recherche le type de
chaque
-- colonne de la PK, et rajouter selon les cas des cotes ' dans
-- la requ=EAte.
--=20
--=20
-- Exemple : cette requ=EAte renvoie pour chaque utilisateur :
-- - Son identifiant (PK de la table des utilisateurs
-- - Son code civilit=E9
-- - Le libell=E9 en anglais (EN) correspondant au code
-- civilit=E9 calcul=E9 avec la fonction LIBELLE_LANGUE
-- SELECT
-- INT_UTIL_CODE,
-- INT_CIVILITE_CODE,
-- libelle_langue(
-- 'TBL_CIVILITE',
-- 'TBL_CIVILITE_LG',
-- 'VCH_CIVILITE',
-- 'EN',
-- 'INT_CIVILITE_CODE',
-- INT_CIVILITE_CODE
-- ) as "Libelle"
-- FROM
-- TBL_UTILISATEUR;

BEGIN
DECLARE
@clause_where VARCHAR(4000),
@curseur_lan CURSOR ,
@curseur_def CURSOR ,
@valeur VARCHAR(4000)

SET @clause_where =3D NULL
SET @valeur =3D NULL
--------------------------------------------------------
--=20
-- PARTIE VERIFICATION
--=20
--------------------------------------------------------

--------------------------------------------------------
-- VERIFICATIONS TRIVIALES
--------------------------------------------------------
IF @table_normale IS NULL OR @table_langue IS NULL OR
@colonne_libelle IS NULL OR @code_langue IS NULL
BEGIN
RETURN 'Un param=E8tre essentiel est null !'
END

--------------------------------------------------------
-- VERIFICATION COHERENCE PK
--------------------------------------------------------
IF @pk1_nom IS NULL
BEGIN
RETURN 'Pas de clef primaire !'
END

IF @pk1_valeur IS NULL
BEGIN
RETURN 'Pas de valeur fournie pour la clef primaire !'
END

IF (@pk2_nom IS NULL AND @pk2_valeur IS NOT NULL) OR
(@pk2_nom IS NOT NULL AND @pk2_valeur IS NULL)
BEGIN
RETURN 'Deuxi=E8me colonne pk incoh=E9rente !'
END

IF (@pk3_nom IS NULL AND @pk3_valeur IS NOT NULL) OR
(@pk3_nom IS NOT NULL AND @pk3_valeur IS NULL)
BEGIN
RETURN 'Troisi=E8me colonne pk incoh=E9rente !'
END

IF (@pk4_nom IS NULL AND @pk4_valeur IS NOT NULL) OR
(@pk4_nom IS NOT NULL AND @pk4_valeur IS NULL)
BEGIN
RETURN 'Quatri=E8me colonne pk incoh=E9rente !'
END

IF (@pk5_nom IS NULL AND @pk5_valeur IS NOT NULL) OR
(@pk5_nom IS NOT NULL AND @pk5_valeur IS NULL)
BEGIN
RETURN 'Cinqui=E8me colonne pk incoh=E9rente !'
END

IF (@pk6_nom IS NULL AND @pk6_valeur IS NOT NULL) OR
(@pk6_nom IS NOT NULL AND @pk6_valeur IS NULL)
BEGIN
RETURN 'Sixi=E8me colonne pk incoh=E9rente !'
END

--------------------------------------------------------
-- VERIFICATION CORRESPONDANCE TABLE / COLONNE
--------------------------------------------------------

-- Coh=E9rence table "normale"
IF (dbo.COLONNE_EXISTE_DANS_TABLE(@colonne_libelle,
@table_normale) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @colonne_libelle + ' dans la
table ' + @table_normale + ' !'
END

IF (dbo.COLONNE_EXISTE_DANS_TABLE(@colonne_libelle,
@table_normale) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @colonne_libelle + ' dans la
table ' + @table_normale + ' !'
END

IF @pk2_nom IS NOT NULL AND @pk2_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk2_nom, @table_normale) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk2_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk3_nom IS NOT NULL AND @pk3_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk3_nom, @table_normale) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk3_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk4_nom IS NOT NULL AND @pk4_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk4_nom, @table_normale) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk4_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk5_nom IS NOT NULL AND @pk5_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk5_nom, @table_normale) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk5_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk6_nom IS NOT NULL AND @pk6_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk6_nom, @table_normale) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk6_nom + ' dans la table ' +
@table_normale + ' !'
END

-- Coh=E9rence table langue (normalement assur=E9e si la coh=E9rence
-- de la table normale l'est...)
IF (dbo.COLONNE_EXISTE_DANS_TABLE(@pk1_nom, @table_langue) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk1_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk2_nom IS NOT NULL AND @pk2_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk2_nom, @table_langue) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk2_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk3_nom IS NOT NULL AND @pk3_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk3_nom, @table_langue) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk3_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk4_nom IS NOT NULL AND @pk4_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk4_nom, @table_langue) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk4_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk5_nom IS NOT NULL AND @pk5_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk5_nom, @table_langue) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk5_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk6_nom IS NOT NULL AND @pk6_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk6_nom, @table_langue) =3D 0)
BEGIN
RETURN 'Pas de colonne ' + @pk6_nom + ' dans la table ' +
@table_langue + ' !'
END

--------------------------------------------------------
--=20
-- PARTIE RECHERCHE DE LA VALEUR A RENVOYER
--=20
--------------------------------------------------------

--------------------------------------------------------
-- CONSTRUCTION DE LA CLAUSE WHERE
--------------------------------------------------------
SET @clause_where =3D ' WHERE ' + @pk1_nom + ' =3D ' +
CONVERT(VARCHAR, @pk1_valeur) + ' AND '

IF @pk2_nom IS NOT NULL
BEGIN
SET @clause_where =3D @clause_where + @pk2_nom + ' =3D ' +
CONVERT(VARCHAR, @pk2_valeur) + ' AND '
END

IF @pk3_nom IS NOT NULL
BEGIN
SET @clause_where =3D @clause_where + @pk3_nom + ' =3D ' +
CONVERT(VARCHAR, @pk3_valeur) + ' AND '
END

IF @pk4_nom IS NOT NULL
BEGIN
SET @clause_where =3D @clause_where + @pk4_nom + ' =3D ' +
CONVERT(VARCHAR, @pk4_valeur) + ' AND '
END

IF @pk5_nom IS NOT NULL
BEGIN
SET @clause_where =3D @clause_where + @pk5_nom + ' =3D ' +
CONVERT(VARCHAR, @pk5_valeur) + ' AND '
END

IF @pk6_nom IS NOT NULL
BEGIN
SET @clause_where =3D @clause_where + @pk6_nom + ' =3D ' +
CONVERT(VARCHAR, @pk6_valeur) + ' AND '
END

-- suppression du dernier 'AND '
SET @clause_where =3D SUBSTRING(@clause_where, 1,
DATALENGTH(@clause_where) - 4)

--------------------------------------------------------
-- RECHERCHE DE LA VALEUR DANS LA TABLE DE LANGUE
--------------------------------------------------------
SET @curseur_lan =3D CURSOR FOR SELECT ( 'SELECT ' +
@colonne_libelle + ' FROM ' + @table_langue + @clause_where
+ ' AND VCH_LAN_CODE =3D ''' + @code_langue + '''')
OPEN @curseur_lan
IF Cursor_Status('variable', '@curseur_lan') < 0
BEGIN
--EXEC SAVE_ERROR 'INVALID_CURSOR', -1001
GOTO OTHERS
END
FETCH @curseur_lan INTO @valeur
IF @@FETCH_STATUS =3D 0
BEGIN
CLOSE @curseur_lan
DEALLOCATE @curseur_lan
RETURN @valeur

END

--------------------------------------------------------
-- RECHERCHE DE LA VALEUR DANS LA TABLE DEFAUT
--------------------------------------------------------
SET @curseur_def =3D CURSOR FOR SELECT ( 'SELECT ' +
@colonne_libelle + ' FROM ' + @table_normale + @clause_where)
OPEN @curseur_def
IF Cursor_Status('variable', '@curseur_def') < 0
BEGIN
--EXEC SAVE_ERROR 'INVALID_CURSOR', -1001
GOTO OTHERS
END
FETCH @curseur_def INTO @valeur
IF @@FETCH_STATUS =3D 0
BEGIN
CLOSE @curseur_def
DEALLOCATE @curseur_def
RETURN @valeur


END

--------------------------------------------------------
-- CAS D'ERREUR
--------------------------------------------------------


GOTO END_LOCAL_BLOCK

OTHERS:
BEGIN
RETURN 'Erreur : ' -- + GET_ERROR_MSG()

END
END_LOCAL_BLOCK:

RETURN 'Aucune valeur trouv=E9e'
END
GO

2 réponses

Avatar
Fred BROUARD
Bonjour,

commencez par données des tailles réalistes et normatives aux définitions des
types d'objet encapsulant des noms SQL. La norme SQL précise 128 caractères max
ce qui est précisément la limite admise sous SQL Server...

Donc :

CREATE FUNCTION LIBELLE_LANGUE (
@table_normale VARCHAR(128),
@table_langue VARCHAR(128),
@colonne_libelle VARCHAR(128),
@code_langue VARCHAR(128),
@pk1_nom VARCHAR(128),
@pk1_valeur INTEGER,
@pk2_nom VARCHAR(128) = NULL,
@pk2_valeur INTEGER = NULL,
@pk3_nom VARCHAR(128) = NULL,
@pk3_valeur INTEGER = NULL,
@pk4_nom VARCHAR(128) = NULL,
@pk4_valeur INTEGER = NULL,
@pk5_nom VARCHAR(128) = NULL,
@pk5_valeur INTEGER = NULL,
@pk6_nom VARCHAR(128) = NULL,
@pk6_valeur INTEGER = NULL
)
RETURNS VARCHAR(8000)
AS
...

de plus vous ranstypez avec des CONVERT sans paramètres et ans taille !

préférez des CAST (c'est la norme SQL) et précisez la taille.

Exemple :
MAUVAIS => CONVERT(VARCHAR, @pk1_valeur)
BON => CAST(@pk1_valeur AS VARCHAR(128))

En dehors de cela il faudrait voir votre modèle de données pour vous repondre
plus en avant.

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste 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
************************ www.datasapiens.com *************************

GrosseVache a écrit:
Lors de la migration Oracle => SQL Server, cette fonction
ne renvoie plus le résultat de la requete, mais la requete
elle-même.

Des idées ?


IF EXISTS (SELECT *
FROM sysobjects
WHERE id = object_id('LIBELLE_LANGUE') AND type = 'FN')
DROP FUNCTION LIBELLE_LANGUE
GO
CREATE FUNCTION LIBELLE_LANGUE (
@table_normale VARCHAR(8000),
@table_langue VARCHAR(8000),
@colonne_libelle VARCHAR(8000),
@code_langue VARCHAR(8000),
@pk1_nom VARCHAR(8000),
@pk1_valeur INTEGER,
@pk2_nom VARCHAR(8000) = NULL,
@pk2_valeur INTEGER = NULL,
@pk3_nom VARCHAR(8000) = NULL,
@pk3_valeur INTEGER = NULL,
@pk4_nom VARCHAR(8000) = NULL,
@pk4_valeur INTEGER = NULL,
@pk5_nom VARCHAR(8000) = NULL,
@pk5_valeur INTEGER = NULL,
@pk6_nom VARCHAR(8000) = NULL,
@pk6_valeur INTEGER = NULL
)
RETURNS VARCHAR(8000)
AS

-- Cette fonction renvoie le libellé de la colonne
"colonne_libelle" prise :
-- - dans la table "table_langue" si une ligne existe pour
la clef
-- primaire passée en paramètre avec le code langue
"code_langue".
-- - dans la table "table_normale" s'il n'y a pas de valeur
ad hoc
-- dans "table langue".


Avatar
Patrice
Il me semble que le curseur fait un select d'une chaine (le select retourne
donc cette chaine)...

Patrice

--

"GrosseVache" a écrit dans le message de
news:186401c55479$33fad620$
Lors de la migration Oracle => SQL Server, cette fonction
ne renvoie plus le résultat de la requete, mais la requete
elle-même.

Des idées ?


IF EXISTS (SELECT *
FROM sysobjects
WHERE id = object_id('LIBELLE_LANGUE') AND type = 'FN')
DROP FUNCTION LIBELLE_LANGUE
GO
CREATE FUNCTION LIBELLE_LANGUE (
@table_normale VARCHAR(8000),
@table_langue VARCHAR(8000),
@colonne_libelle VARCHAR(8000),
@code_langue VARCHAR(8000),
@pk1_nom VARCHAR(8000),
@pk1_valeur INTEGER,
@pk2_nom VARCHAR(8000) = NULL,
@pk2_valeur INTEGER = NULL,
@pk3_nom VARCHAR(8000) = NULL,
@pk3_valeur INTEGER = NULL,
@pk4_nom VARCHAR(8000) = NULL,
@pk4_valeur INTEGER = NULL,
@pk5_nom VARCHAR(8000) = NULL,
@pk5_valeur INTEGER = NULL,
@pk6_nom VARCHAR(8000) = NULL,
@pk6_valeur INTEGER = NULL
)
RETURNS VARCHAR(8000)
AS

-- Cette fonction renvoie le libellé de la colonne
"colonne_libelle" prise :
-- - dans la table "table_langue" si une ligne existe pour
la clef
-- primaire passée en paramètre avec le code langue
"code_langue".
-- - dans la table "table_normale" s'il n'y a pas de valeur
ad hoc
-- dans "table langue".
--
-- PRE-REQUIS :
-- - la clef primaire ne comporte pas plus de 6 colonnes
-- - la colonne code langue a pour nom VCH_LAN_CODE pour toutes
-- les tables de langue.
-- - toutes les autres colonnes de toutes les autres clefs
primaires
-- sont numériques (sinon il faudrait recherche le type de
chaque
-- colonne de la PK, et rajouter selon les cas des cotes ' dans
-- la requête.
--
--
-- Exemple : cette requête renvoie pour chaque utilisateur :
-- - Son identifiant (PK de la table des utilisateurs
-- - Son code civilité
-- - Le libellé en anglais (EN) correspondant au code
-- civilité calculé avec la fonction LIBELLE_LANGUE
-- SELECT
-- INT_UTIL_CODE,
-- INT_CIVILITE_CODE,
-- libelle_langue(
-- 'TBL_CIVILITE',
-- 'TBL_CIVILITE_LG',
-- 'VCH_CIVILITE',
-- 'EN',
-- 'INT_CIVILITE_CODE',
-- INT_CIVILITE_CODE
-- ) as "Libelle"
-- FROM
-- TBL_UTILISATEUR;

BEGIN
DECLARE
@clause_where VARCHAR(4000),
@curseur_lan CURSOR ,
@curseur_def CURSOR ,
@valeur VARCHAR(4000)

SET @clause_where = NULL
SET @valeur = NULL
--------------------------------------------------------
--
-- PARTIE VERIFICATION
--
--------------------------------------------------------

--------------------------------------------------------
-- VERIFICATIONS TRIVIALES
--------------------------------------------------------
IF @table_normale IS NULL OR @table_langue IS NULL OR
@colonne_libelle IS NULL OR @code_langue IS NULL
BEGIN
RETURN 'Un paramètre essentiel est null !'
END

--------------------------------------------------------
-- VERIFICATION COHERENCE PK
--------------------------------------------------------
IF @pk1_nom IS NULL
BEGIN
RETURN 'Pas de clef primaire !'
END

IF @pk1_valeur IS NULL
BEGIN
RETURN 'Pas de valeur fournie pour la clef primaire !'
END

IF (@pk2_nom IS NULL AND @pk2_valeur IS NOT NULL) OR
(@pk2_nom IS NOT NULL AND @pk2_valeur IS NULL)
BEGIN
RETURN 'Deuxième colonne pk incohérente !'
END

IF (@pk3_nom IS NULL AND @pk3_valeur IS NOT NULL) OR
(@pk3_nom IS NOT NULL AND @pk3_valeur IS NULL)
BEGIN
RETURN 'Troisième colonne pk incohérente !'
END

IF (@pk4_nom IS NULL AND @pk4_valeur IS NOT NULL) OR
(@pk4_nom IS NOT NULL AND @pk4_valeur IS NULL)
BEGIN
RETURN 'Quatrième colonne pk incohérente !'
END

IF (@pk5_nom IS NULL AND @pk5_valeur IS NOT NULL) OR
(@pk5_nom IS NOT NULL AND @pk5_valeur IS NULL)
BEGIN
RETURN 'Cinquième colonne pk incohérente !'
END

IF (@pk6_nom IS NULL AND @pk6_valeur IS NOT NULL) OR
(@pk6_nom IS NOT NULL AND @pk6_valeur IS NULL)
BEGIN
RETURN 'Sixième colonne pk incohérente !'
END

--------------------------------------------------------
-- VERIFICATION CORRESPONDANCE TABLE / COLONNE
--------------------------------------------------------

-- Cohérence table "normale"
IF (dbo.COLONNE_EXISTE_DANS_TABLE(@colonne_libelle,
@table_normale) = 0)
BEGIN
RETURN 'Pas de colonne ' + @colonne_libelle + ' dans la
table ' + @table_normale + ' !'
END

IF (dbo.COLONNE_EXISTE_DANS_TABLE(@colonne_libelle,
@table_normale) = 0)
BEGIN
RETURN 'Pas de colonne ' + @colonne_libelle + ' dans la
table ' + @table_normale + ' !'
END

IF @pk2_nom IS NOT NULL AND @pk2_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk2_nom, @table_normale) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk2_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk3_nom IS NOT NULL AND @pk3_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk3_nom, @table_normale) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk3_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk4_nom IS NOT NULL AND @pk4_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk4_nom, @table_normale) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk4_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk5_nom IS NOT NULL AND @pk5_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk5_nom, @table_normale) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk5_nom + ' dans la table ' +
@table_normale + ' !'
END

IF @pk6_nom IS NOT NULL AND @pk6_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk6_nom, @table_normale) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk6_nom + ' dans la table ' +
@table_normale + ' !'
END

-- Cohérence table langue (normalement assurée si la cohérence
-- de la table normale l'est...)
IF (dbo.COLONNE_EXISTE_DANS_TABLE(@pk1_nom, @table_langue) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk1_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk2_nom IS NOT NULL AND @pk2_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk2_nom, @table_langue) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk2_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk3_nom IS NOT NULL AND @pk3_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk3_nom, @table_langue) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk3_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk4_nom IS NOT NULL AND @pk4_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk4_nom, @table_langue) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk4_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk5_nom IS NOT NULL AND @pk5_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk5_nom, @table_langue) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk5_nom + ' dans la table ' +
@table_langue + ' !'
END

IF @pk6_nom IS NOT NULL AND @pk6_valeur IS NOT NULL AND
(dbo.COLONNE_EXISTE_DANS_TABLE(@pk6_nom, @table_langue) = 0)
BEGIN
RETURN 'Pas de colonne ' + @pk6_nom + ' dans la table ' +
@table_langue + ' !'
END

--------------------------------------------------------
--
-- PARTIE RECHERCHE DE LA VALEUR A RENVOYER
--
--------------------------------------------------------

--------------------------------------------------------
-- CONSTRUCTION DE LA CLAUSE WHERE
--------------------------------------------------------
SET @clause_where = ' WHERE ' + @pk1_nom + ' = ' +
CONVERT(VARCHAR, @pk1_valeur) + ' AND '

IF @pk2_nom IS NOT NULL
BEGIN
SET @clause_where = @clause_where + @pk2_nom + ' = ' +
CONVERT(VARCHAR, @pk2_valeur) + ' AND '
END

IF @pk3_nom IS NOT NULL
BEGIN
SET @clause_where = @clause_where + @pk3_nom + ' = ' +
CONVERT(VARCHAR, @pk3_valeur) + ' AND '
END

IF @pk4_nom IS NOT NULL
BEGIN
SET @clause_where = @clause_where + @pk4_nom + ' = ' +
CONVERT(VARCHAR, @pk4_valeur) + ' AND '
END

IF @pk5_nom IS NOT NULL
BEGIN
SET @clause_where = @clause_where + @pk5_nom + ' = ' +
CONVERT(VARCHAR, @pk5_valeur) + ' AND '
END

IF @pk6_nom IS NOT NULL
BEGIN
SET @clause_where = @clause_where + @pk6_nom + ' = ' +
CONVERT(VARCHAR, @pk6_valeur) + ' AND '
END

-- suppression du dernier 'AND '
SET @clause_where = SUBSTRING(@clause_where, 1,
DATALENGTH(@clause_where) - 4)

--------------------------------------------------------
-- RECHERCHE DE LA VALEUR DANS LA TABLE DE LANGUE
--------------------------------------------------------
SET @curseur_lan = CURSOR FOR SELECT ( 'SELECT ' +
@colonne_libelle + ' FROM ' + @table_langue + @clause_where
+ ' AND VCH_LAN_CODE = ''' + @code_langue + '''')
OPEN @curseur_lan
IF Cursor_Status('variable', '@curseur_lan') < 0
BEGIN
--EXEC SAVE_ERROR 'INVALID_CURSOR', -1001
GOTO OTHERS
END
FETCH @curseur_lan INTO @valeur
IF @@FETCH_STATUS = 0
BEGIN
CLOSE @curseur_lan
DEALLOCATE @curseur_lan
RETURN @valeur

END

--------------------------------------------------------
-- RECHERCHE DE LA VALEUR DANS LA TABLE DEFAUT
--------------------------------------------------------
SET @curseur_def = CURSOR FOR SELECT ( 'SELECT ' +
@colonne_libelle + ' FROM ' + @table_normale + @clause_where)
OPEN @curseur_def
IF Cursor_Status('variable', '@curseur_def') < 0
BEGIN
--EXEC SAVE_ERROR 'INVALID_CURSOR', -1001
GOTO OTHERS
END
FETCH @curseur_def INTO @valeur
IF @@FETCH_STATUS = 0
BEGIN
CLOSE @curseur_def
DEALLOCATE @curseur_def
RETURN @valeur


END

--------------------------------------------------------
-- CAS D'ERREUR
--------------------------------------------------------


GOTO END_LOCAL_BLOCK

OTHERS:
BEGIN
RETURN 'Erreur : ' -- + GET_ERROR_MSG()

END
END_LOCAL_BLOCK:

RETURN 'Aucune valeur trouvée'
END
GO