OVH Cloud OVH Cloud

Procédure avec variables pour accéder à un champ d'une table passé en param

8 réponses
Avatar
Gilles
Bonjour à tous,

Quesques soucis en Procédure stocké

en entré de celle-ci, je donne le nom d'une table et des champs de type
varchar

Comment bien ecrire ceci
@Var1 et var2 sont des variables de la procédure stocké


SELECT @Variable = ' + @Champ1+ ', @Var2 = ' + @Champ_Pere + ' FROM @latable
WHERE ' + @Champ3 + ' = @idChamp4

Je suis partie vers execute sans succès
je coince un peu dans la syntaxe
Je n'ai pas trouvé non plus le moyen de tracer !!

Merci pour vos réponse
Gilles quand même un bon débutant en transact

8 réponses

Avatar
Laurent MOREAU
SELECT @Req= 'SELECT ' + @ChampsSELECT + ' FROM ' + @LaTable + ' WHERE ' +
@ChampWhere + '='' + REPLACE(@ValeurWHERE,'''','''''') + ''''

PRINT @Req
EXEC (@Req)


Pour la valeur du champ du where on double les simple cotes par REPLACE
Print permet de tracer
EXEC () permet d'exécuter.

Laurent.



"Gilles" wrote in message
news:#
Bonjour à tous,

Quesques soucis en Procédure stocké

en entré de celle-ci, je donne le nom d'une table et des champs de type
varchar

Comment bien ecrire ceci
@Var1 et var2 sont des variables de la procédure stocké


SELECT @Variable = ' + @Champ1+ ', @Var2 = ' + @Champ_Pere + ' FROM


@latable
WHERE ' + @Champ3 + ' = @idChamp4

Je suis partie vers execute sans succès
je coince un peu dans la syntaxe
Je n'ai pas trouvé non plus le moyen de tracer !!

Merci pour vos réponse
Gilles quand même un bon débutant en transact




Avatar
Gilles
Merci laurent

je planche sur tes remarques

Gilles

"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le message
de news: cuq8qg$pt0$

SELECT @Req= 'SELECT ' + @ChampsSELECT + ' FROM ' + @LaTable + ' WHERE ' +
@ChampWhere + '='' + REPLACE(@ValeurWHERE,'''','''''') + ''''

PRINT @Req
EXEC (@Req)


Pour la valeur du champ du where on double les simple cotes par REPLACE
Print permet de tracer
EXEC () permet d'exécuter.

Laurent.



"Gilles" wrote in message
news:#
Bonjour à tous,

Quesques soucis en Procédure stocké

en entré de celle-ci, je donne le nom d'une table et des champs de type
varchar

Comment bien ecrire ceci
@Var1 et var2 sont des variables de la procédure stocké


SELECT @Variable = ' + @Champ1+ ', @Var2 = ' + @Champ_Pere + ' FROM


@latable
WHERE ' + @Champ3 + ' = @idChamp4

Je suis partie vers execute sans succès
je coince un peu dans la syntaxe
Je n'ai pas trouvé non plus le moyen de tracer !!

Merci pour vos réponse
Gilles quand même un bon débutant en transact








Avatar
Laurent MOREAU
Il manque une simple cote apres le = (il faut 3 ici)

Laurent.



"Gilles" wrote in message
news:
Merci laurent

je planche sur tes remarques

Gilles

"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le


message
de news: cuq8qg$pt0$
>
> SELECT @Req= 'SELECT ' + @ChampsSELECT + ' FROM ' + @LaTable + ' WHERE '


+
> @ChampWhere + '='' + REPLACE(@ValeurWHERE,'''','''''') + ''''
>
> PRINT @Req
> EXEC (@Req)
>
>
> Pour la valeur du champ du where on double les simple cotes par REPLACE
> Print permet de tracer
> EXEC () permet d'exécuter.
>
> Laurent.
>
>
>
> "Gilles" wrote in message
> news:#
>> Bonjour à tous,
>>
>> Quesques soucis en Procédure stocké
>>
>> en entré de celle-ci, je donne le nom d'une table et des champs de type
>> varchar
>>
>> Comment bien ecrire ceci
>> @Var1 et var2 sont des variables de la procédure stocké
>>
>>
>> SELECT @Variable = ' + @Champ1+ ', @Var2 = ' + @Champ_Pere + ' FROM
> @latable
>> WHERE ' + @Champ3 + ' = @idChamp4
>>
>> Je suis partie vers execute sans succès
>> je coince un peu dans la syntaxe
>> Je n'ai pas trouvé non plus le moyen de tracer !!
>>
>> Merci pour vos réponse
>> Gilles quand même un bon débutant en transact
>>
>>
>
>




Avatar
Gilles
Je reprend donc

A partir d'un trigger je veux appeler une procédure stockée générique

Début de mon source

CREATE PROCEDURE SegP_INS_Arbo
@latable varChar(50),
@Champ_Princ varchar(50),
@Champ_pere varchar(50),
@Champ_tri varchar(50)
AS
DECLARE @OK int,
@id_pere int,
@id_insere int, -- id inséré
@val_champ_tri varChar(50)

DECLARE @Req varchar(8000)

-- démarrage transaction
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION INSERT_ARBO
SELECT @id_insere = IDENT_CURRENT('Compte')
SELECT @Req= 'SELECT @val_champ_tri = ' + @Champ_tri+ ', @id_pere = ' +
@Champ_Pere + ' FROM ' + @latable + ' WHERE ' + @Champ_Princ + ' =
@id_insere'
PRINT @Req
EXEC(@Req)

Mon trigger de test ----------
IF EXISTS ( SELECT name FROM SysObjects
WHERE NAME = 'Test_trig' and type = 'TR')
DROP TRIGGER Test_trig
GO
CREATE TRIGGER Test_trig
ON COMPTE
AFTER INSERT
AS
EXECUTE SegP_INS_Arbo 'compte','IdCompte', 'IdPere' , 'Compte'
GO


Je n'arrive pas me positionner sur l'enregistrement créé (j'ai aussi essayé
"inserted" dans trigger car il n'est pas possible de l'utiliser dans la
procédure

Comment me positionner sur l'enregistrement inséré

Gilles
Avatar
Laurent MOREAU
Dans une requete dynamique on ne peut pas valoriser une variable (a moins de
la déclarer dans la requete dynamique, pas interessant ici puisqu'on la
perdrait a la fin de l'EXEC)

Il faut passer par une table temporaire:

CREATE TABLE #Tmp (val_champ_tri varChar(50))

SELECT @Req= 'INSERT INTO #Tmp (val_champ_tri) SELECT ' + @Champ_tri+ ',
@id_pere = ' + ...........

EXEC (@Req)
SELECT @val_champ_tri = val_champ_tri FROM #Tmp


Ceci dit, je n'ai pas essayé de compdre ce que tu voulais faire.
Et quand je lis: "Comment me positionner sur l'enregistrement inséré"
Je te rappel que @@Identity peut etre tres utile... (si tu ne connais pas ,
voir aide en ligne)


Laurent.



"Gilles" wrote in message
news:##KpD$
Je reprend donc

A partir d'un trigger je veux appeler une procédure stockée générique

Début de mon source

CREATE PROCEDURE SegP_INS_Arbo
@latable varChar(50),
@Champ_Princ varchar(50),
@Champ_pere varchar(50),
@Champ_tri varchar(50)
AS
DECLARE @OK int,
@id_pere int,
@id_insere int, -- id inséré
@val_champ_tri varChar(50)

DECLARE @Req varchar(8000)

-- démarrage transaction
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION INSERT_ARBO
SELECT @id_insere = IDENT_CURRENT('Compte')
SELECT @Req= 'SELECT @val_champ_tri = ' + @Champ_tri+ ', @id_pere = ' +
@Champ_Pere + ' FROM ' + @latable + ' WHERE ' + @Champ_Princ + ' > @id_insere'
PRINT @Req
EXEC(@Req)

Mon trigger de test ----------
IF EXISTS ( SELECT name FROM SysObjects
WHERE NAME = 'Test_trig' and type = 'TR')
DROP TRIGGER Test_trig
GO
CREATE TRIGGER Test_trig
ON COMPTE
AFTER INSERT
AS
EXECUTE SegP_INS_Arbo 'compte','IdCompte', 'IdPere' , 'Compte'
GO


Je n'arrive pas me positionner sur l'enregistrement créé (j'ai aussi


essayé
"inserted" dans trigger car il n'est pas possible de l'utiliser dans la
procédure

Comment me positionner sur l'enregistrement inséré

Gilles




Avatar
Laurent MOREAU
J'oubliais, avec sp_execute, tu peux déclarer des params en OUPUT.

Laurent.




"Gilles" wrote in message
news:##KpD$
Je reprend donc

A partir d'un trigger je veux appeler une procédure stockée générique

Début de mon source

CREATE PROCEDURE SegP_INS_Arbo
@latable varChar(50),
@Champ_Princ varchar(50),
@Champ_pere varchar(50),
@Champ_tri varchar(50)
AS
DECLARE @OK int,
@id_pere int,
@id_insere int, -- id inséré
@val_champ_tri varChar(50)

DECLARE @Req varchar(8000)

-- démarrage transaction
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION INSERT_ARBO
SELECT @id_insere = IDENT_CURRENT('Compte')
SELECT @Req= 'SELECT @val_champ_tri = ' + @Champ_tri+ ', @id_pere = ' +
@Champ_Pere + ' FROM ' + @latable + ' WHERE ' + @Champ_Princ + ' > @id_insere'
PRINT @Req
EXEC(@Req)

Mon trigger de test ----------
IF EXISTS ( SELECT name FROM SysObjects
WHERE NAME = 'Test_trig' and type = 'TR')
DROP TRIGGER Test_trig
GO
CREATE TRIGGER Test_trig
ON COMPTE
AFTER INSERT
AS
EXECUTE SegP_INS_Arbo 'compte','IdCompte', 'IdPere' , 'Compte'
GO


Je n'arrive pas me positionner sur l'enregistrement créé (j'ai aussi


essayé
"inserted" dans trigger car il n'est pas possible de l'utiliser dans la
procédure

Comment me positionner sur l'enregistrement inséré

Gilles




Avatar
Gilles
J'avoue je commence fort et à mon avis je n'ai pas en core tout le langage
technique nécéssaire pour me faire comprendre :-)

Ce que je veux réaliser c'est une procédure stockée qui pourrait être
appelée de trigger différent donc de table avec des champs différents !!
Une procédure commune pour éviter de réécrire le source à chaque trigger

Pour chaque enregistrement il faudra mettre à jour des champs (qui eux ont
été créé avec des labels identique d'une table à l'autre)

Bref la procédure stocké n'est pas lié à une table et doit être entièrement
paramétrable pour cette mise à jour d'un trigger

Je vais pas t'ennuyer plus longtemp
Je te remerci de ton aide et me plonger dans les aides et exemples que je
trouverais :-)


Gilles



"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le message
de news: cuqd4l$srv$
J'oubliais, avec sp_execute, tu peux déclarer des params en OUPUT.

Laurent.




"Gilles" wrote in message
news:##KpD$
Je reprend donc

A partir d'un trigger je veux appeler une procédure stockée générique

Début de mon source

CREATE PROCEDURE SegP_INS_Arbo
@latable varChar(50),
@Champ_Princ varchar(50),
@Champ_pere varchar(50),
@Champ_tri varchar(50)
AS
DECLARE @OK int,
@id_pere int,
@id_insere int, -- id inséré
@val_champ_tri varChar(50)

DECLARE @Req varchar(8000)

-- démarrage transaction
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION INSERT_ARBO
SELECT @id_insere = IDENT_CURRENT('Compte')
SELECT @Req= 'SELECT @val_champ_tri = ' + @Champ_tri+ ', @id_pere = ' +
@Champ_Pere + ' FROM ' + @latable + ' WHERE ' + @Champ_Princ + ' >> @id_insere'
PRINT @Req
EXEC(@Req)

Mon trigger de test ----------
IF EXISTS ( SELECT name FROM SysObjects
WHERE NAME = 'Test_trig' and type = 'TR')
DROP TRIGGER Test_trig
GO
CREATE TRIGGER Test_trig
ON COMPTE
AFTER INSERT
AS
EXECUTE SegP_INS_Arbo 'compte','IdCompte', 'IdPere' , 'Compte'
GO


Je n'arrive pas me positionner sur l'enregistrement créé (j'ai aussi


essayé
"inserted" dans trigger car il n'est pas possible de l'utiliser dans la
procédure

Comment me positionner sur l'enregistrement inséré

Gilles








Avatar
Gilles
Laurent,

Grace à tes indications, j'ai réussi à faire ma procédure stockée de rève
:-)
en utilisant une table tempo je règle tous mes problèmes !!!

Mille merci pour ton aide
Si un jour je peux donner un coup de main ....

Gilles - Clarion 5 - SQL server
SEGILOG Nord-59