OVH Cloud OVH Cloud

Procédures stockées

15 réponses
Avatar
Portekoi
Bonjour =E0 tous,

Je vais essayer d'=EAtre clair.
J'ai une proc stock qui me cr=E9=E9 une table temporaire.=20
Cette proc=E9dure est compos=E9 de 3 curseurs. Le premier me=20
prends le num=E9ro de l'utilisateur. Dans ce cursor ce=20
trouve un autre cursor qui suivant le num=E9ro=20
d'utilisateur va chercher le ou les groupes pour cette=20
personne.

Je r=E9cup=E8re les groupes de cette facon :=20
SET @groupesql =3D ' CONVERT(varchar,groupe_id) =3D ' + =20
CONVERT(varchar,@groupe_id) + ' or' + @groupesql=20

A la fin de cette seconde boucle, j'ouvre un troisi=E8me=20
cursor qui fais ceci :

--On va chercher les acces
Declare cursor_acces CURSOR
FOR SELECT DISTINCT acces.nom FROM acces INNER JOIN =20
acces_groupe ON acces.id =3D acces_groupe.acces_id WHERE=20
CONVERT(varchar,1) =3D CONVERT(varchar,1) + 'and' + =20
substring(@groupesql,1,len(@groupesql)-3)
OPEN cursor_acces
etc..

Le probl=E8me, c'est que quand j'enl=E8ve " + 'and' + =20
substring(@groupesql,1,len(@groupesql)-3)" la requete=20
fonctionne sinon, elle ne renvoie aucun r=E9sultat alors=20
que quand je l'affiche et que je l'ex=E9cute, tout=20
fonctionne...

A l'aide :)

Portekoi

10 réponses

1 2
Avatar
Fred BROUARD
Bonjour,

dans 90% des cas il est possible de se passer de curseur.

Non seulement c'est très souvent possible mais c'est fortement conseillé pour
des raisons de performances et de verouillage.

Poste la définition de tes tables sous forme d'ordre SQL de type CREATE TABLE.

Poste ensuite le code de ta proc stock en la documentant (ce qu'elle est censée
faire)

A partir de cela une seule requête devrait suffire !

A +


PS : es tu nain, Portekoi ?
--
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 *************************



Portekoi a écrit:
Bonjour à tous,

Je vais essayer d'être clair.
J'ai une proc stock qui me créé une table temporaire.
Cette procédure est composé de 3 curseurs. Le premier me
prends le numéro de l'utilisateur. Dans ce cursor ce
trouve un autre cursor qui suivant le numéro
d'utilisateur va chercher le ou les groupes pour cette
personne.

Je récupère les groupes de cette facon :
SET @groupesql = ' CONVERT(varchar,groupe_id) = ' +
CONVERT(varchar,@groupe_id) + ' or' + @groupesql

A la fin de cette seconde boucle, j'ouvre un troisième
cursor qui fais ceci :

--On va chercher les acces
Declare cursor_acces CURSOR
FOR SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE
CONVERT(varchar,1) = CONVERT(varchar,1) + 'and' +
substring(@groupesql,1,len(@groupesql)-3)
OPEN cursor_acces
etc..

Le problème, c'est que quand j'enlève " + 'and' +
substring(@groupesql,1,len(@groupesql)-3)" la requete
fonctionne sinon, elle ne renvoie aucun résultat alors
que quand je l'affiche et que je l'exécute, tout
fonctionne...

A l'aide :)

Portekoi


Avatar
Voici le code la proc stock :

--La procédure doit me retourner
id - login - agence - acces* - nom_prenom - groupe* -
email

--* acces ou groupe doivent etre de la forme :
_audit_agence_admin

CREATE PROCEDURE [acces_utilisateur] AS

--déclaratin des variables

DECLARE @groupe varchar(50)
DECLARE @id int,@login varchar(50), @acces varchar(50),
@agence varchar(5), @nom_prenom varchar (100),@email
varchar (150)
DECLARE @groupesql varchar(200), @groupe_id int
declare @groupe_ varchar (150)
declare @SQL varchar (150)
declare @acces_ varchar (150)
--fin de la déclaration

--initialisation
set @groupe_ = ''
SET @groupesql = ''
SET @acces_ = ''

--création de la table temporaire
CREATE TABLE #Table_temporaire (id INT PRIMARY KEY, login
varchar(50), agence varchar(50), acces varchar(150),
nom_prenom varchar (150), groupe varchar (150), email
varchar (150))
DECLARE cursor_1 CURSOR
FOR SELECT DISTINCT utilisateur.id, utilisateur.login,
SUBSTRING(agence.nom, 1, 3) AS agence,
utilisateur.nom_prenom, utilisateur.email
FROM agence_utilisateur INNER JOIN
utilisateur ON agence_utilisateur.utilisateur_id =
utilisateur.id INNER JOIN
agence ON agence_utilisateur.agence_id = agence.id
OPEN cursor_1
FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
WHILE @@Fetch_STATUS = 0
BEGIN
--On va chercher les groupes
Declare cursor_groupe CURSOR
For SELECT DISTINCT groupe.nom, groupe.id FROM groupe
INNER JOIN groupe_utilisateur ON groupe.id =
groupe_utilisateur.groupe_id WHERE
groupe_utilisateur.utilisateur_id = @id
OPEN cursor_groupe
Fetch next from cursor_groupe
INTO @groupe, @groupe_id
WHILE @@Fetch_STATUS = 0
BEGIN
SET @groupe_ = @groupe_ + '_' + @groupe
SET @groupesql = ' CONVERT(varchar,groupe_id) = ' +
CONVERT(varchar,@groupe_id) + ' or' + @groupesql

Fetch next from cursor_groupe
INTO @groupe, @groupe_id
END
CLOSE cursor_groupe;
DEALLOCATE cursor_groupe;

--On va chercher les acces
Declare cursor_acces CURSOR
FOR SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE
CONVERT(varchar,1) = CONVERT(varchar,1) + 'and' +
substring(@groupesql,1,len(@groupesql)-3)
-- + CONVERT(varchar,1) = CONVERT(varchar,1) + 'and' +
substring(@groupesql,1,len(@groupesql)-3)

OPEN cursor_acces
Fetch next from cursor_acces
INTO @acces
WHILE @@Fetch_STATUS = 0
BEGIN
SET @acces_ = @acces_ + '_' + @acces
print 'coucou'
Fetch next from cursor_acces
INTO @acces
END
CLOSE cursor_acces;
DEALLOCATE cursor_acces;
--(@@FETCH_STATUS <> -1
--SET @SQL = "SELECT DISTINCT acces.nom FROM acces INNER
JOIN acces_groupe ON acces.id = acces_groupe.acces_id
WHERE " + CONVERT(varchar,1) + "=" + CONVERT(varchar,1)
+ 'and' + substring(@groupesql,1,len(@groupesql)-3)

INSERT INTO #table_temporaire VALUES (@id, @login,
@agence, @acces_, @nom_prenom, SUBSTRING(@groupe_,2,len
(@groupe_)),@email)

set @groupe_ = ''
set @acces_ = ''
set @groupesql=''

FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
END
CLOSE cursor_1;
DEALLOCATE cursor_1;

SELECT * from #table_temporaire
GO

Je débute totalement.... en asp, j'utilise le do while
rs.eof, mais je n'y arrive pas en Transac :(

Et oui je suis [NAIN]Portekoi d'un clan de jeu en ligne :)

A toute

Damien :)
Avatar
Portekoi
Quel est l'équivalent de ceci sans curseur?

Declare cursor_groupe CURSOR
For SELECT DISTINCT groupe.nom, groupe.id FROM groupe
INNER JOIN groupe_utilisateur ON groupe.id =
groupe_utilisateur.groupe_id WHERE
groupe_utilisateur.utilisateur_id = @id
OPEN cursor_groupe
Fetch next from cursor_groupe
INTO @groupe, @groupe_id
WHILE @@Fetch_STATUS = 0
BEGIN
SET @groupe_ = @groupe_ + '_' + @groupe
SET @groupesql = ' CONVERT(varchar,groupe_id) = ' +
CONVERT(varchar,@groupe_id) + ' or' + @groupesql

Fetch next from cursor_groupe
INTO @groupe, @groupe_id
END
CLOSE cursor_groupe;
DEALLOCATE cursor_groupe;
Avatar
Fred BROUARD
De ma vie je n'ai jamais vu un code aussi débile. Excuse moi d'être aussi
direct, mais vraiment là je pensais avoir déjà touché le fond de l'horreur mais
à ce point c'est épouvantable.

Grosso modo voici une requête qui remplace tout ton code.
A toi de trouver par quoi remplacer les ???. Je ne peut deviner ton modèle et en
l'absence d'un jeu d'essai difficile de faire plus

SELECT DISTINCT U.id,
U.login,
SUBSTRING(A.nom, 1, 3) AS agence,
-- l'acces
???,
U.nom_prenom,
-- le groupe
???,
U.email
FROM agence_utilisateur AU
INNER JOIN utilisateur U
ON AU.utilisateur_id = U.id
INNER JOIN agence A
ON AU.agence_id = A.id
INNER JOIN groupe_utilisateur GU
ON GU.utilisateur_id = U.id
INNER JOIN groupe G
ON G.id = GU.groupe_id
INNER JOIN acces AXS
ON AXS.id = AG.acces_id
INNER JOIN acces_groupe AG
ON AXS.id = AG.acces_id

Quelques conseils : apprendre le SQL et indenter tes requêtes, parce que là
comme écriture de merde.. Chapeau !

A +


a écrit:
Voici le code la proc stock :

--La procédure doit me retourner
id - login - agence - acces* - nom_prenom - groupe* -
email

--* acces ou groupe doivent etre de la forme :
_audit_agence_admin

CREATE PROCEDURE [acces_utilisateur] AS

--déclaratin des variables

DECLARE @groupe varchar(50)
DECLARE @id int,@login varchar(50), @acces varchar(50),
@agence varchar(5), @nom_prenom varchar (100),@email
varchar (150)
DECLARE @groupesql varchar(200), @groupe_id int
declare @groupe_ varchar (150)
declare @SQL varchar (150)
declare @acces_ varchar (150)
--fin de la déclaration

--initialisation
set @groupe_ = ''
SET @groupesql = ''
SET @acces_ = ''

--création de la table temporaire
CREATE TABLE #Table_temporaire (id INT PRIMARY KEY, login
varchar(50), agence varchar(50), acces varchar(150),
nom_prenom varchar (150), groupe varchar (150), email
varchar (150))
DECLARE cursor_1 CURSOR
FOR SELECT DISTINCT utilisateur.id, utilisateur.login,
SUBSTRING(agence.nom, 1, 3) AS agence,
utilisateur.nom_prenom, utilisateur.email
FROM agence_utilisateur INNER JOIN
utilisateur ON agence_utilisateur.utilisateur_id =
utilisateur.id INNER JOIN
agence ON agence_utilisateur.agence_id = agence.id
OPEN cursor_1
FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
WHILE @@Fetch_STATUS = 0
BEGIN
--On va chercher les groupes
Declare cursor_groupe CURSOR
For SELECT DISTINCT groupe.nom, groupe.id FROM groupe
INNER JOIN groupe_utilisateur ON groupe.id =
groupe_utilisateur.groupe_id WHERE
groupe_utilisateur.utilisateur_id = @id
OPEN cursor_groupe
Fetch next from cursor_groupe
INTO @groupe, @groupe_id
WHILE @@Fetch_STATUS = 0
BEGIN
SET @groupe_ = @groupe_ + '_' + @groupe
SET @groupesql = ' CONVERT(varchar,groupe_id) = ' +
CONVERT(varchar,@groupe_id) + ' or' + @groupesql

Fetch next from cursor_groupe
INTO @groupe, @groupe_id
END
CLOSE cursor_groupe;
DEALLOCATE cursor_groupe;

--On va chercher les acces
Declare cursor_acces CURSOR
FOR SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE
CONVERT(varchar,1) = CONVERT(varchar,1) + 'and' +
substring(@groupesql,1,len(@groupesql)-3)
-- + CONVERT(varchar,1) = CONVERT(varchar,1) + 'and' +
substring(@groupesql,1,len(@groupesql)-3)

OPEN cursor_acces
Fetch next from cursor_acces
INTO @acces
WHILE @@Fetch_STATUS = 0
BEGIN
SET @acces_ = @acces_ + '_' + @acces
print 'coucou'
Fetch next from cursor_acces
INTO @acces
END
CLOSE cursor_acces;
DEALLOCATE cursor_acces;
--(@@FETCH_STATUS <> -1
--SET @SQL = "SELECT DISTINCT acces.nom FROM acces INNER
JOIN acces_groupe ON acces.id = acces_groupe.acces_id
WHERE " + CONVERT(varchar,1) + "=" + CONVERT(varchar,1)
+ 'and' + substring(@groupesql,1,len(@groupesql)-3)

INSERT INTO #table_temporaire VALUES (@id, @login,
@agence, @acces_, @nom_prenom, SUBSTRING(@groupe_,2,len
(@groupe_)),@email)

set @groupe_ = ''
set @acces_ = ''
set @groupesql=''

FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
END
CLOSE cursor_1;
DEALLOCATE cursor_1;

SELECT * from #table_temporaire
GO

Je débute totalement.... en asp, j'utilise le do while
rs.eof, mais je n'y arrive pas en Transac :(

Et oui je suis [NAIN]Portekoi d'un clan de jeu en ligne :)

A toute

Damien :)



--
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 *************************
Avatar
Merci mais je connais le SQL et ta requete ne m'apprends
franchement rien.

Je veux savoir comment faire une boucle toute simple pour
concaténer une chaine et insérer le tout dans une table
temporaire.

Merci de ton aide, mais si c'est pour passer pour un con
( que je ne suis pas ), je vais m'en passer.

De plus, j'ai cassé mon indentation parce que lorsque tu
postes, ce n'est pas respecté.

@+

Portekoi


-----Message d'origine-----
De ma vie je n'ai jamais vu un code aussi débile. Excuse


moi d'être aussi
direct, mais vraiment là je pensais avoir déjà touché le


fond de l'horreur mais
à ce point c'est épouvantable.

Grosso modo voici une requête qui remplace tout ton code.
A toi de trouver par quoi remplacer les ???. Je ne peut


deviner ton modèle et en
l'absence d'un jeu d'essai difficile de faire plus

SELECT DISTINCT U.id,
U.login,
SUBSTRING(A.nom, 1, 3) AS agence,
-- l'acces
???,
U.nom_prenom,
-- le groupe
???,
U.email
FROM agence_utilisateur AU
INNER JOIN utilisateur U
ON AU.utilisateur_id = U.id
INNER JOIN agence A
ON AU.agence_id = A.id
INNER JOIN groupe_utilisateur GU
ON GU.utilisateur_id = U.id
INNER JOIN groupe G
ON G.id = GU.groupe_id
INNER JOIN acces AXS
ON AXS.id = AG.acces_id
INNER JOIN acces_groupe AG
ON AXS.id = AG.acces_id

Quelques conseils : apprendre le SQL et indenter tes


requêtes, parce que là
comme écriture de merde.. Chapeau !

A +


a écrit:
Voici le code la proc stock :

--La procédure doit me retourner
id - login - agence - acces* - nom_prenom - groupe* -
email

--* acces ou groupe doivent etre de la forme :
_audit_agence_admin

CREATE PROCEDURE [acces_utilisateur] AS

--déclaratin des variables

DECLARE @groupe varchar(50)
DECLARE @id int,@login varchar(50), @acces varchar




(50),
@agence varchar(5), @nom_prenom varchar (100),@email
varchar (150)
DECLARE @groupesql varchar(200), @groupe_id int
declare @groupe_ varchar (150)
declare @SQL varchar (150)
declare @acces_ varchar (150)
--fin de la déclaration

--initialisation
set @groupe_ = ''
SET @groupesql = ''
SET @acces_ = ''

--création de la table temporaire
CREATE TABLE #Table_temporaire (id INT PRIMARY KEY,




login
varchar(50), agence varchar(50), acces varchar(150),
nom_prenom varchar (150), groupe varchar (150), email
varchar (150))
DECLARE cursor_1 CURSOR
FOR SELECT DISTINCT utilisateur.id,




utilisateur.login,
SUBSTRING(agence.nom, 1, 3) AS agence,
utilisateur.nom_prenom, utilisateur.email
FROM agence_utilisateur INNER JOIN
utilisateur ON agence_utilisateur.utilisateur_id =
utilisateur.id INNER JOIN
agence ON agence_utilisateur.agence_id = agence.id
OPEN cursor_1
FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
WHILE @@Fetch_STATUS = 0
BEGIN
--On va chercher les groupes
Declare cursor_groupe CURSOR
For SELECT DISTINCT groupe.nom, groupe.id FROM groupe
INNER JOIN groupe_utilisateur ON groupe.id =
groupe_utilisateur.groupe_id WHERE
groupe_utilisateur.utilisateur_id = @id
OPEN cursor_groupe
Fetch next from cursor_groupe
INTO @groupe, @groupe_id
WHILE @@Fetch_STATUS = 0
BEGIN
SET @groupe_ = @groupe_ + '_' + @groupe
SET @groupesql = ' CONVERT(varchar,groupe_id) = ' +
CONVERT(varchar,@groupe_id) + ' or' + @groupesql

Fetch next from cursor_groupe
INTO @groupe, @groupe_id
END
CLOSE cursor_groupe;
DEALLOCATE cursor_groupe;

--On va chercher les acces
Declare cursor_acces CURSOR
FOR SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE
CONVERT(varchar,1) = CONVERT(varchar,1) + 'and' +
substring(@groupesql,1,len(@groupesql)-3)
-- + CONVERT(varchar,1) = CONVERT(varchar,1) + 'and'




+
substring(@groupesql,1,len(@groupesql)-3)

OPEN cursor_acces
Fetch next from cursor_acces
INTO @acces
WHILE @@Fetch_STATUS = 0
BEGIN
SET @acces_ = @acces_ + '_' + @acces
print 'coucou'
Fetch next from cursor_acces
INTO @acces
END
CLOSE cursor_acces;
DEALLOCATE cursor_acces;
--(@@FETCH_STATUS <> -1
--SET @SQL = "SELECT DISTINCT acces.nom FROM acces




INNER
JOIN acces_groupe ON acces.id = acces_groupe.acces_id
WHERE " + CONVERT(varchar,1) + "=" + CONVERT




(varchar,1)
+ 'and' + substring(@groupesql,1,len(@groupesql)-3)

INSERT INTO #table_temporaire VALUES (@id, @login,
@agence, @acces_, @nom_prenom, SUBSTRING(@groupe_,2,len
(@groupe_)),@email)

set @groupe_ = ''
set @acces_ = ''
set @groupesql=''

FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
END
CLOSE cursor_1;
DEALLOCATE cursor_1;

SELECT * from #table_temporaire
GO

Je débute totalement.... en asp, j'utilise le do while
rs.eof, mais je n'y arrive pas en Transac :(

Et oui je suis [NAIN]Portekoi d'un clan de jeu en




ligne :)

A toute

Damien :)



--
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


*************************

.



Avatar
Portekoi
J'ajoute ceci : Je n'ai fais que reprendre le code qui ce
trouve sur cette page :

http://www.laltruiste.com/document.php?
url=http://www.laltruiste.com/courssql/cmd_curseur.html

Pour ce qui est de la structure de ma base, voici les
tables :

acces // Liste les accès possible
acces_groupe // croisement d'un id accès et d'un id groupe
agence // liste des agences
agence_utilisateur // croisement d'un id utilisateur et
d'un id agence
groupe // Liste les groupes
groupe_utilisateur // Croise les groupes avec les
utilisateurs ( admin-agence etc... )
utilisateur liste les utilisateurs

Voilà mon schéma de base. J'ai biensur fais un diagramme
sous Sql server et tout fonctionne très bien.

Ce que je veux, c'est récupérer les accès et les groupes
en une seule requete. j'avais donc pensé à une procédure
stockée afin de boucler et ainsi récupérer les différents
accès pour un groupe. Pareil pour les groupes, un
utilisateur peut appartenir à plusieurs groupes, donc
récupérer tous les groupes dans cette même requete.

Si tu trouves quelque chose de moins "débile" je suis
preneur.

Portekoi

PS : J'ai pas tilté tout de suite, mais j'ai acheté un de
tes livres.
PS2 : Désolé pour mon post précédent mais j'ai vraiment
l'impression que tu n'as pas compris ma demande, d'ou ta
réponse 'débile' si je puis dire.
Avatar
Philippe T [MS]
Bonjour,

Dans le cas qui te préoccupe en fait pour la mise à jour des groupes et des
accès, ton objectif est de regrouper sur une même ligne (en concaténant) la
liste des groupes, puis la liste des accès d'un utilisateur. Tu n'as sans
doute pas trop le choix dans l'utilisattion des curseurs. Par contre, tu
peux effectivement gagner en lisibilité comme suit :

CREATE PROCEDURE [acces_utilisateur]
AS
BEGIN
--création de la table temporaire
CREATE TABLE #Table_temporaire (
id INT PRIMARY KEY, login varchar(50), agence varchar(50),
acces varchar(150), nom_prenom varchar (150),
groupe varchar (150), email varchar (150))

-- Insertion des données utilisateurs
INSERT INTO #Table_temporaire(id, login, agence, nom_prenom email)
SELECT DISTINCT utilisateur.id, utilisateur.login,
SUBSTRING(agence.nom, 1, 3) AS agence,
utilisateur.nom_prenom, utilisateur.email
FROM agence_utilisateur
INNER JOIN utilisateur ON agence_utilisateur.utilisateur_id utilisateur.id
INNER JOIN agence ON agence_utilisateur.agence_id = agence.id

UPDATE #Table_temporaire
SET groupe = dbo.GetUserGroup(id)

UPDATE #Table_temporaire
SET acces = dbo.GetUserAccess(id)

SELECT * from #table_temporaire
END
GO

Ensuite, il faut créer les fonctions : dbo.GetUserGroup(id) &
dbo.GetUserAccess(id) qui renvoi des chaines et là effectivement dans
chacune tu vas avoir 1 curseur.

Bon courage.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

wrote in message
news:0d2601c52b03$81cd7870$
Merci mais je connais le SQL et ta requete ne m'apprends
franchement rien.

Je veux savoir comment faire une boucle toute simple pour
concaténer une chaine et insérer le tout dans une table
temporaire.

Merci de ton aide, mais si c'est pour passer pour un con
( que je ne suis pas ), je vais m'en passer.

De plus, j'ai cassé mon indentation parce que lorsque tu
postes, ce n'est pas respecté.

@+

Portekoi


-----Message d'origine-----
De ma vie je n'ai jamais vu un code aussi débile. Excuse


moi d'être aussi
direct, mais vraiment là je pensais avoir déjà touché le


fond de l'horreur mais
à ce point c'est épouvantable.

Grosso modo voici une requête qui remplace tout ton code.
A toi de trouver par quoi remplacer les ???. Je ne peut


deviner ton modèle et en
l'absence d'un jeu d'essai difficile de faire plus

SELECT DISTINCT U.id,
U.login,
SUBSTRING(A.nom, 1, 3) AS agence,
-- l'acces
???,
U.nom_prenom,
-- le groupe
???,
U.email
FROM agence_utilisateur AU
INNER JOIN utilisateur U
ON AU.utilisateur_id = U.id
INNER JOIN agence A
ON AU.agence_id = A.id
INNER JOIN groupe_utilisateur GU
ON GU.utilisateur_id = U.id
INNER JOIN groupe G
ON G.id = GU.groupe_id
INNER JOIN acces AXS
ON AXS.id = AG.acces_id
INNER JOIN acces_groupe AG
ON AXS.id = AG.acces_id

Quelques conseils : apprendre le SQL et indenter tes


requêtes, parce que là
comme écriture de merde.. Chapeau !

A +


a écrit:
Voici le code la proc stock :

--La procédure doit me retourner
id - login - agence - acces* - nom_prenom - groupe* -
email

--* acces ou groupe doivent etre de la forme :
_audit_agence_admin

CREATE PROCEDURE [acces_utilisateur] AS

--déclaratin des variables

DECLARE @groupe varchar(50)
DECLARE @id int,@login varchar(50), @acces varchar




(50),
@agence varchar(5), @nom_prenom varchar (100),@email
varchar (150)
DECLARE @groupesql varchar(200), @groupe_id int
declare @groupe_ varchar (150)
declare @SQL varchar (150)
declare @acces_ varchar (150)
--fin de la déclaration

--initialisation
set @groupe_ = ''
SET @groupesql = ''
SET @acces_ = ''

--création de la table temporaire
CREATE TABLE #Table_temporaire (id INT PRIMARY KEY,




login
varchar(50), agence varchar(50), acces varchar(150),
nom_prenom varchar (150), groupe varchar (150), email
varchar (150))
DECLARE cursor_1 CURSOR
FOR SELECT DISTINCT utilisateur.id,




utilisateur.login,
SUBSTRING(agence.nom, 1, 3) AS agence,
utilisateur.nom_prenom, utilisateur.email
FROM agence_utilisateur INNER JOIN
utilisateur ON agence_utilisateur.utilisateur_id >> utilisateur.id INNER JOIN
agence ON agence_utilisateur.agence_id = agence.id
OPEN cursor_1
FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
WHILE @@Fetch_STATUS = 0
BEGIN
--On va chercher les groupes
Declare cursor_groupe CURSOR
For SELECT DISTINCT groupe.nom, groupe.id FROM groupe
INNER JOIN groupe_utilisateur ON groupe.id >> groupe_utilisateur.groupe_id WHERE
groupe_utilisateur.utilisateur_id = @id
OPEN cursor_groupe
Fetch next from cursor_groupe
INTO @groupe, @groupe_id
WHILE @@Fetch_STATUS = 0
BEGIN
SET @groupe_ = @groupe_ + '_' + @groupe
SET @groupesql = ' CONVERT(varchar,groupe_id) = ' +
CONVERT(varchar,@groupe_id) + ' or' + @groupesql

Fetch next from cursor_groupe
INTO @groupe, @groupe_id
END
CLOSE cursor_groupe;
DEALLOCATE cursor_groupe;

--On va chercher les acces
Declare cursor_acces CURSOR
FOR SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE
CONVERT(varchar,1) = CONVERT(varchar,1) + 'and' +
substring(@groupesql,1,len(@groupesql)-3)
-- + CONVERT(varchar,1) = CONVERT(varchar,1) + 'and'




+
substring(@groupesql,1,len(@groupesql)-3)

OPEN cursor_acces
Fetch next from cursor_acces
INTO @acces
WHILE @@Fetch_STATUS = 0
BEGIN
SET @acces_ = @acces_ + '_' + @acces
print 'coucou'
Fetch next from cursor_acces
INTO @acces
END
CLOSE cursor_acces;
DEALLOCATE cursor_acces;
--(@@FETCH_STATUS <> -1
--SET @SQL = "SELECT DISTINCT acces.nom FROM acces




INNER
JOIN acces_groupe ON acces.id = acces_groupe.acces_id
WHERE " + CONVERT(varchar,1) + "=" + CONVERT




(varchar,1)
+ 'and' + substring(@groupesql,1,len(@groupesql)-3)

INSERT INTO #table_temporaire VALUES (@id, @login,
@agence, @acces_, @nom_prenom, SUBSTRING(@groupe_,2,len
(@groupe_)),@email)

set @groupe_ = ''
set @acces_ = ''
set @groupesql=''

FETCH next from cursor_1
INTO @id, @login, @agence, @nom_prenom, @email
END
CLOSE cursor_1;
DEALLOCATE cursor_1;

SELECT * from #table_temporaire
GO

Je débute totalement.... en asp, j'utilise le do while
rs.eof, mais je n'y arrive pas en Transac :(

Et oui je suis [NAIN]Portekoi d'un clan de jeu en




ligne :)

A toute

Damien :)



--
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


*************************

.



Avatar
Portekoi
Re bonsoir,

J'ai regardé pour utiliser une fonction mais mon soucis
est :
Dans un premier temps, je vais donc chercher les
utilisateurs avec leur ID respectif.

Ensuite, avec l'ID, je vais cherche le ou LES groupe(s)
auxquels il appartient. Je vais donc avoir un résultat
avec plusieurs groupes : 6 15 par exemple.
Donc, je prends ces résultats et je les transforme de
cette facon :
SET @groupesql = ' groupe_id = ' + @groupe_id + ' or'
+ @groupesql
Ce qui donne pour valeur à @groupesql :
groupe_id = 6 or groupe_id = 15 or

Ensuite, je dois aller chercher les accès pour chacun des
groupes ci-dessus d'ou l'utilité de @groupesql car voici
la requete pour récupérer ces fameux accès :
"SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE" +
substring(@groupesql,1,len(@groupesql)-3) ce qui me
donne :

" SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE
groupe_id = 6 or groupe_id = 15 "

La requete exécutée comme cela fonctionne mais pas dans
la procédure stockée. J'ai essayé sp_executesql mais
cela ne fonctionne pas dans la déclaration du curseur...

A la fin, il dois me retourner pour
groupe "_admin_agence" par exemple et en
acces "_appli1_appli4_appli13_appli24"

Je sais pas si je peux être plus clair ^_^

A bientot et merci

Portekoi
Avatar
Fred BROUARD
Salut,

tu ne me met toujours pas les noms des colonnes de tes tables, ni un exemple de
ce que tu veut en réponse.

D'autre part si, comme je le pense tu veut faire une concaténation de plusieurs
valeurs dans une même colonne pour la table réponse, alors ça c'est une erreur,
ce n'est pas à SQL de le faire.


Portekoi a écrit:
J'ajoute ceci : Je n'ai fais que reprendre le code qui ce
trouve sur cette page :

http://www.laltruiste.com/document.php?
url=http://www.laltruiste.com/courssql/cmd_curseur.html

Pour ce qui est de la structure de ma base, voici les
tables :

acces // Liste les accès possible
acces_groupe // croisement d'un id accès et d'un id groupe
agence // liste des agences
agence_utilisateur // croisement d'un id utilisateur et
d'un id agence
groupe // Liste les groupes
groupe_utilisateur // Croise les groupes avec les
utilisateurs ( admin-agence etc... )
utilisateur liste les utilisateurs

Voilà mon schéma de base. J'ai biensur fais un diagramme
sous Sql server et tout fonctionne très bien.

Ce que je veux, c'est récupérer les accès et les groupes
en une seule requete. j'avais donc pensé à une procédure
stockée afin de boucler et ainsi récupérer les différents
accès pour un groupe. Pareil pour les groupes, un
utilisateur peut appartenir à plusieurs groupes, donc
récupérer tous les groupes dans cette même requete.

Si tu trouves quelque chose de moins "débile" je suis
preneur.

Portekoi

PS : J'ai pas tilté tout de suite, mais j'ai acheté un de
tes livres.
PS2 : Désolé pour mon post précédent mais j'ai vraiment
l'impression que tu n'as pas compris ma demande, d'ou ta
réponse 'débile' si je puis dire.



mais je suis aussi assez dur !!!

(même envers moi même ... )

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 *************************
Avatar
Patrice
Pour la concaténation j'avais vu une fois une astuce sympa dont le principe
est le suivant :

declare @t VARCHAR(8000)
select @tÊSE WHEN @t IS NULL THEN Table_Name ELSE @t+','+Table_Name END
FROM Information_Schema.tables
print @t

Je te laisse voir si tu peux l'adapter à ton cas que j'avoue avoir un peu
survolé...

(Fred est de bon conseil mais ne mets jamais de gants même en hiver)

Patrice

--

"Portekoi" a écrit dans le message de
news:0dde01c52b11$045c6690$
Re bonsoir,

J'ai regardé pour utiliser une fonction mais mon soucis
est :
Dans un premier temps, je vais donc chercher les
utilisateurs avec leur ID respectif.

Ensuite, avec l'ID, je vais cherche le ou LES groupe(s)
auxquels il appartient. Je vais donc avoir un résultat
avec plusieurs groupes : 6 15 par exemple.
Donc, je prends ces résultats et je les transforme de
cette facon :
SET @groupesql = ' groupe_id = ' + @groupe_id + ' or'
+ @groupesql
Ce qui donne pour valeur à @groupesql :
groupe_id = 6 or groupe_id = 15 or

Ensuite, je dois aller chercher les accès pour chacun des
groupes ci-dessus d'ou l'utilité de @groupesql car voici
la requete pour récupérer ces fameux accès :
"SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE" +
substring(@groupesql,1,len(@groupesql)-3) ce qui me
donne :

" SELECT DISTINCT acces.nom FROM acces INNER JOIN
acces_groupe ON acces.id = acces_groupe.acces_id WHERE
groupe_id = 6 or groupe_id = 15 "

La requete exécutée comme cela fonctionne mais pas dans
la procédure stockée. J'ai essayé sp_executesql mais
cela ne fonctionne pas dans la déclaration du curseur...

A la fin, il dois me retourner pour
groupe "_admin_agence" par exemple et en
acces "_appli1_appli4_appli13_appli24"

Je sais pas si je peux être plus clair ^_^

A bientot et merci

Portekoi
1 2