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;
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
-- 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()
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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...
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".
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...
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".
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...
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".
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;
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
-- 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
Il me semble que le curseur fait un select d'une chaine (le select retourne
donc cette chaine)...
Patrice
--
"GrosseVache" <jlouzoun@free.fr> a écrit dans le message de
news:186401c55479$33fad620$a601280a@phx.gbl...
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;
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
-- 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()
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;
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
-- 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()