IF @ID_MARQUE = 0
BEGIN
SELECT * FROM MODELES
WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP)
END
ELSE
BEGIN
SELECT ID_MODELE FROM MODELES
WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP)
AND ID_MARQUE = @ID_MARQUE
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
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
Yanos El Guerilleros
Salut,
Il faut savoir qu'une procédure stockée retourne une chaine de recordset pour chaque instruction SELECT, INSERT, UPDATE et DELETE exécutée à l'intérieur. Pour le SELECT on récupère un recordset ouvert et contenant le résultat, pour les autres on récupère un recordset fermé mais avec le nombre d'enregistrements modifiés par l'instruction.
Dans l'analyseur ca se caractérise par l'affichage de --> (x ligne(s) affectée(s))
Ton INSERT provoque donc la création d'un recordset dans ta chaine de résultat, et comme il est avant ton SELECT et que tu récupère le premier de la liste en résultat tu as une erreur de lecture (le recordset de INSERT étant fermé).
On peut annuler ce fonctionnement via les commandes SET NOCOUNT ON/OFF
Un SET NOCOUNT ON au début de ta procédure et SET NOCOUNT OFF à la fin évite la création des recordset fermés dans la chaine.
Sinon tu peux vouloir retourner plusieurs recordset depuis une procédure stockée, on parcours alors la chaine via la méthode NextRecordset d'un objet ADODB.Recordset.
A++
Yanos
Troyan wrote:
Voici un exemple de SP qui fonctionne bien sous l'analyseur de requete mais pas en asp j'ai l'erreur suivante !!!
ADODB.Recordset erreur '800a0e78' Cette opération n'est pas autorisée si l'objet est fermé.
mais si je vire les lignes CREATE TABLE #TABLE_TEMP (ID_FAMILLE INT) INSERT INTO #TABLE_TEMP (ID_FAMILLE) EXEC ARBO_FAMILLES_DESC @ID_FAMILLE
de la procedure ca fonctionne que dois modifier dans la SP ??? j'y comprends plus rien !!!!
SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO
ALTER PROCEDURE [SEL_MODELES_DESC] @ID_FAMILLE as INT , @ID_MARQUE as INT = 0 AS
IF @ID_MARQUE = 0 BEGIN SELECT * FROM MODELES WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP) END ELSE BEGIN SELECT ID_MODELE FROM MODELES WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP) AND ID_MARQUE = @ID_MARQUE END
GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
Salut,
Il faut savoir qu'une procédure stockée retourne une chaine de recordset
pour chaque instruction SELECT, INSERT, UPDATE et DELETE exécutée à
l'intérieur. Pour le SELECT on récupère un recordset ouvert et contenant le
résultat, pour les autres on récupère un recordset fermé mais avec le nombre
d'enregistrements modifiés par l'instruction.
Dans l'analyseur ca se caractérise par l'affichage de --> (x ligne(s)
affectée(s))
Ton INSERT provoque donc la création d'un recordset dans ta chaine de
résultat, et comme il est avant ton SELECT et que tu récupère le premier de
la liste en résultat tu as une erreur de lecture (le recordset de INSERT
étant fermé).
On peut annuler ce fonctionnement via les commandes
SET NOCOUNT ON/OFF
Un SET NOCOUNT ON au début de ta procédure et SET NOCOUNT OFF à la fin évite
la création des recordset fermés dans la chaine.
Sinon tu peux vouloir retourner plusieurs recordset depuis une procédure
stockée, on parcours alors la chaine via la méthode NextRecordset d'un objet
ADODB.Recordset.
A++
Yanos
Troyan wrote:
Voici un exemple de SP qui fonctionne bien sous l'analyseur de
requete mais pas en asp
j'ai l'erreur suivante !!!
ADODB.Recordset erreur '800a0e78'
Cette opération n'est pas autorisée si l'objet est fermé.
mais si je vire les lignes
CREATE TABLE #TABLE_TEMP (ID_FAMILLE INT)
INSERT INTO #TABLE_TEMP (ID_FAMILLE)
EXEC ARBO_FAMILLES_DESC @ID_FAMILLE
de la procedure ca fonctionne
que dois modifier dans la SP ???
j'y comprends plus rien !!!!
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER PROCEDURE [SEL_MODELES_DESC] @ID_FAMILLE as INT , @ID_MARQUE
as INT = 0 AS
IF @ID_MARQUE = 0
BEGIN
SELECT * FROM MODELES
WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP)
END
ELSE
BEGIN
SELECT ID_MODELE FROM MODELES
WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP)
AND ID_MARQUE = @ID_MARQUE
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Il faut savoir qu'une procédure stockée retourne une chaine de recordset pour chaque instruction SELECT, INSERT, UPDATE et DELETE exécutée à l'intérieur. Pour le SELECT on récupère un recordset ouvert et contenant le résultat, pour les autres on récupère un recordset fermé mais avec le nombre d'enregistrements modifiés par l'instruction.
Dans l'analyseur ca se caractérise par l'affichage de --> (x ligne(s) affectée(s))
Ton INSERT provoque donc la création d'un recordset dans ta chaine de résultat, et comme il est avant ton SELECT et que tu récupère le premier de la liste en résultat tu as une erreur de lecture (le recordset de INSERT étant fermé).
On peut annuler ce fonctionnement via les commandes SET NOCOUNT ON/OFF
Un SET NOCOUNT ON au début de ta procédure et SET NOCOUNT OFF à la fin évite la création des recordset fermés dans la chaine.
Sinon tu peux vouloir retourner plusieurs recordset depuis une procédure stockée, on parcours alors la chaine via la méthode NextRecordset d'un objet ADODB.Recordset.
A++
Yanos
Troyan wrote:
Voici un exemple de SP qui fonctionne bien sous l'analyseur de requete mais pas en asp j'ai l'erreur suivante !!!
ADODB.Recordset erreur '800a0e78' Cette opération n'est pas autorisée si l'objet est fermé.
mais si je vire les lignes CREATE TABLE #TABLE_TEMP (ID_FAMILLE INT) INSERT INTO #TABLE_TEMP (ID_FAMILLE) EXEC ARBO_FAMILLES_DESC @ID_FAMILLE
de la procedure ca fonctionne que dois modifier dans la SP ??? j'y comprends plus rien !!!!
SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO
ALTER PROCEDURE [SEL_MODELES_DESC] @ID_FAMILLE as INT , @ID_MARQUE as INT = 0 AS
IF @ID_MARQUE = 0 BEGIN SELECT * FROM MODELES WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP) END ELSE BEGIN SELECT ID_MODELE FROM MODELES WHERE ID_FAMILLE in (SELECT ID_FAMILLE FROM #TABLE_TEMP) AND ID_MARQUE = @ID_MARQUE END
GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO