OVH Cloud OVH Cloud

procédure stockée + SELECT dynamique

2 réponses
Avatar
Bruno
Bonjour,

Etant novice dans les procédures stockées, j'arrive à éxécuter des
procédures relativement simple :

CREATE PROCEDURE [moi].[MaProc]
(
@PremiereDate DATETIME,
@DerniereDate DATETIME,
@NumNatureDispositif int
)
AS
SELECT TOP 100 PERCENT REFERENCE, DureeModule
FROM TYPESDEFORMATION
WHERE (MappingON = - 1) AND (TYPESDEFORMATION.ActionCorrectriceON = 0)
AND (DateDebutFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102))
AND (CodeNatureDispositif = @NumNatureDispositif)
OR (MappingON = - 1) AND (TYPESDEFORMATION.ActionCorrectriceON = 0)
AND (CodeNatureDispositif = @NumNatureDispositif)
AND (DateFinFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102))
ORDER BY [N°DOMAINE], DateDebutFormation
GO

En revanche, j'utilise des pages asp qui me génère dynamiquement un ou des
conditions qui viennent compléter ma requête.

Par exemple, la partie AND (TYPESDEFORMATION.ActionCorrectriceON = 0) est
normalement générée dynamiquement.
J'ai essayé d'enfermer ce bout de requête dans une variable que j'envoie en
appelant la procédure, bout de requête que je récupère comme suit :
@SuiteRequete ntext

Mais, lorsque je l'insère, comme les autres variables, dans ma requête SQL,
j'ai un message me signalant une erreur de syntaxe
SELECT TOP 100 PERCENT REFERENCE, DureeModule
FROM TYPESDEFORMATION
WHERE (MappingON = - 1) @SuiteRequete
AND (DateDebutFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102)) etc...

J'ai essayé de rajouter de '+' ou des '||' mais j'ai toujours le même
problème.

Est-il possible de rendre dynamique une partie d'un SELECT dans une
procédure stockée ?

Merci pour votre aide.

2 réponses

Avatar
Philippe T [MS]
Bonjour,

Oui mais dans ces conditions il faut faire du SQL dynamique (voir
sp_executesql dans l'aide en ligne).

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

"Bruno" wrote in message
news:
Bonjour,

Etant novice dans les procédures stockées, j'arrive à éxécuter des
procédures relativement simple :

CREATE PROCEDURE [moi].[MaProc]
(
@PremiereDate DATETIME,
@DerniereDate DATETIME,
@NumNatureDispositif int
)
AS
SELECT TOP 100 PERCENT REFERENCE, DureeModule
FROM TYPESDEFORMATION
WHERE (MappingON = - 1) AND (TYPESDEFORMATION.ActionCorrectriceON = 0)
AND (DateDebutFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102))
AND (CodeNatureDispositif = @NumNatureDispositif)
OR (MappingON = - 1) AND (TYPESDEFORMATION.ActionCorrectriceON = 0)
AND (CodeNatureDispositif = @NumNatureDispositif)
AND (DateFinFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102))
ORDER BY [N°DOMAINE], DateDebutFormation
GO

En revanche, j'utilise des pages asp qui me génère dynamiquement un ou des
conditions qui viennent compléter ma requête.

Par exemple, la partie AND (TYPESDEFORMATION.ActionCorrectriceON = 0) est
normalement générée dynamiquement.
J'ai essayé d'enfermer ce bout de requête dans une variable que j'envoie
en
appelant la procédure, bout de requête que je récupère comme suit :
@SuiteRequete ntext

Mais, lorsque je l'insère, comme les autres variables, dans ma requête
SQL,
j'ai un message me signalant une erreur de syntaxe
SELECT TOP 100 PERCENT REFERENCE, DureeModule
FROM TYPESDEFORMATION
WHERE (MappingON = - 1) @SuiteRequete
AND (DateDebutFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102)) etc...

J'ai essayé de rajouter de '+' ou des '||' mais j'ai toujours le même
problème.

Est-il possible de rendre dynamique une partie d'un SELECT dans une
procédure stockée ?

Merci pour votre aide.


Avatar
Fred BROUARD
Votre requête est déjà assez mal écrite...

En effet l'utilisation de fonction de type CONVERT est ici inutile et couteuse !
Vos parenthèses nne servent à rien sauf pour le OR mais dans ce cas à quoi
est-il lié ce OR ???

De plus, quel est l'intérêt du TOP 100 PERCENT ??? (à part faire perdre du temps...)

Récrivez de la sorte :

CREATE PROCEDURE [moi].[MaProc]
(
@PremiereDate DATETIME,
@DerniereDate DATETIME,
@NumNatureDispositif int
)
AS
SELECT REFERENCE, DureeModule
FROM TYPESDEFORMATION
WHERE MappingON = - 1
AND TYPESDEFORMATION.ActionCorrectriceON = 0
AND DateDebutFormation
BETWEEN @PremiereDate AND @DerniereDate
AND CodeNatureDispositif = @NumNatureDispositif
OR MappingON = - 1
AND TYPESDEFORMATION.ActionCorrectriceON = 0
AND CodeNatureDispositif = @NumNatureDispositif
AND DateFinFormation
BETWEEN @PremiereDate AND @DerniereDate
ORDER BY [N°DOMAINE], DateDebutFormation

A +

Bruno a écrit:
Bonjour,

Etant novice dans les procédures stockées, j'arrive à éxécuter des
procédures relativement simple :

CREATE PROCEDURE [moi].[MaProc]
(
@PremiereDate DATETIME,
@DerniereDate DATETIME,
@NumNatureDispositif int
)
AS
SELECT TOP 100 PERCENT REFERENCE, DureeModule
FROM TYPESDEFORMATION
WHERE (MappingON = - 1) AND (TYPESDEFORMATION.ActionCorrectriceON = 0)
AND (DateDebutFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102))
AND (CodeNatureDispositif = @NumNatureDispositif)
OR (MappingON = - 1) AND (TYPESDEFORMATION.ActionCorrectriceON = 0)
AND (CodeNatureDispositif = @NumNatureDispositif)
AND (DateFinFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102))
ORDER BY [N°DOMAINE], DateDebutFormation
GO

En revanche, j'utilise des pages asp qui me génère dynamiquement un ou des
conditions qui viennent compléter ma requête.

Par exemple, la partie AND (TYPESDEFORMATION.ActionCorrectriceON = 0) est
normalement générée dynamiquement.
J'ai essayé d'enfermer ce bout de requête dans une variable que j'envoie en
appelant la procédure, bout de requête que je récupère comme suit :
@SuiteRequete ntext

Mais, lorsque je l'insère, comme les autres variables, dans ma requête SQL,
j'ai un message me signalant une erreur de syntaxe
SELECT TOP 100 PERCENT REFERENCE, DureeModule
FROM TYPESDEFORMATION
WHERE (MappingON = - 1) @SuiteRequete
AND (DateDebutFormation BETWEEN CONVERT(DATETIME, @PremiereDate, 102)
AND CONVERT(DATETIME, @DerniereDate, 102)) etc...

J'ai essayé de rajouter de '+' ou des '||' mais j'ai toujours le même
problème.

Est-il possible de rendre dynamique une partie d'un SELECT dans une
procédure stockée ?

Merci pour votre aide.



--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************