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

5 réponses

1 2
Avatar
Philippe T [MS]
Bonjour,

Je pense que @groupesql ne sert pas car il est préférable de faire une
requête avec des jointure pour récupérer la même chose :

SELECT DISTINCT acces.nom
FROM acces
INNER JOIN acces_groupe ON acces.id = acces_groupe.acces_id
INNER JOIN groupe ON acces_groupe.acces_id = groupe.id
INNER JOIN groupe_utilisateur ON groupe.id = groupe_utilisateur.groupe_id
WHERE groupe_utilisateur.utilisateur_id = @id


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

"Portekoi" wrote in message
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
Avatar
Fred BROUARD
Patrice a écrit:
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)



Mais on est au printemps, et chez moi en provence, c'est presque l'été !

A +


Patrice




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

Et oui, c'est moi le 'débile'... meuh nan je l'ai pas mal
pris ;)

Ca fonctionne en passant par une autre jointure sur
l'idée de philippe. J'ai donc mes 2 curseurs qui me
renvoient ce qu'il faut.

Maintenant, j'essaie en vain de l'appeller depuis un
script ASP et rien à faire. J'ai mis le SET NOCOUNT ON
mais ca ne fonctionne pas plus. Ce qui est bizarre, c'est
que lorsque je lui passe un utilisateur inexistant, je
n'ai pas d'erreur par contre c'est l'inverse pour un vrai
login...
Voici mon code asp :
sql = "EXECUTE auth.dbo.acces_utilisateur VISIMIC"
'set rs = baselinka.execute ("EXECUTE
auth.dbo.acces_utilisateur momo")
rs.open sql, conn, 3, 3
if not rs.eof then
do while not rs.eof
for each field in rs.fields
response.Write field.name & " => " &
field.value & "<br>"
next
rs.movenext
loop
end if
rs.close

Voici l'erreur renvoyé :
ADODB.Recordset error '800a0e78'

Cette opération n'est pas autorisée si l'objet est fermé.

Ca se produit sur la ligne du "if not rs.eof then"

Help les 'pros' de Sql ;)

Portekoi enfin Damien...enfin le débile :D
Avatar
C'est bon j'ai trouvé....

J'avais un print dans un curseur et ASP n'aime pas trop
ca...
Tout marche maintenant :)

Merci à tous

Portekoi
-----Message d'origine-----
Bonjour,

Et oui, c'est moi le 'débile'... meuh nan je l'ai pas


mal
pris ;)

Ca fonctionne en passant par une autre jointure sur
l'idée de philippe. J'ai donc mes 2 curseurs qui me
renvoient ce qu'il faut.

Maintenant, j'essaie en vain de l'appeller depuis un
script ASP et rien à faire. J'ai mis le SET NOCOUNT ON
mais ca ne fonctionne pas plus. Ce qui est bizarre,


c'est
que lorsque je lui passe un utilisateur inexistant, je
n'ai pas d'erreur par contre c'est l'inverse pour un


vrai
login...
Voici mon code asp :
sql = "EXECUTE auth.dbo.acces_utilisateur VISIMIC"
'set rs = baselinka.execute ("EXECUTE
auth.dbo.acces_utilisateur momo")
rs.open sql, conn, 3, 3
if not rs.eof then
do while not rs.eof
for each field in rs.fields
response.Write field.name & " => " &
field.value & "<br>"
next
rs.movenext
loop
end if
rs.close

Voici l'erreur renvoyé :
ADODB.Recordset error '800a0e78'

Cette opération n'est pas autorisée si l'objet est


fermé.

Ca se produit sur la ligne du "if not rs.eof then"

Help les 'pros' de Sql ;)

Portekoi enfin Damien...enfin le débile :D

.



Avatar
Patrice
Là cela serait plutôt un groupe ASP/ADO.

A priori l'objet RS n'est pas correctement initialisé (où la connexion ?).
Personnellement je passais plutôt par ADODB.Command pour les procédures
stockées...

Bon week-end...

Patrice


--

"Portekoi" a écrit dans le message de
news:077801c52baa$f6ac5150$
Bonjour,

Et oui, c'est moi le 'débile'... meuh nan je l'ai pas mal
pris ;)

Ca fonctionne en passant par une autre jointure sur
l'idée de philippe. J'ai donc mes 2 curseurs qui me
renvoient ce qu'il faut.

Maintenant, j'essaie en vain de l'appeller depuis un
script ASP et rien à faire. J'ai mis le SET NOCOUNT ON
mais ca ne fonctionne pas plus. Ce qui est bizarre, c'est
que lorsque je lui passe un utilisateur inexistant, je
n'ai pas d'erreur par contre c'est l'inverse pour un vrai
login...
Voici mon code asp :
sql = "EXECUTE auth.dbo.acces_utilisateur VISIMIC"
'set rs = baselinka.execute ("EXECUTE
auth.dbo.acces_utilisateur momo")
rs.open sql, conn, 3, 3
if not rs.eof then
do while not rs.eof
for each field in rs.fields
response.Write field.name & " => " &
field.value & "<br>"
next
rs.movenext
loop
end if
rs.close

Voici l'erreur renvoyé :
ADODB.Recordset error '800a0e78'

Cette opération n'est pas autorisée si l'objet est fermé.

Ca se produit sur la ligne du "if not rs.eof then"

Help les 'pros' de Sql ;)

Portekoi enfin Damien...enfin le débile :D
1 2