IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Procédure stockée : la variable scalaire doit être déclarée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 1
    Par défaut Procédure stockée : la variable scalaire doit être déclarée
    Bonjour, j'ai écris une procédure stockée pour remplir une grille en fonction du profil de l'utilisateur connecté. Le problème c'est que ça me renvoie une erreur, et je ne sais quoi faire.Aidez moi s'il vous plait. Voilà ma PS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
     
    ALTER PROCEDURE [dbo].[PS_REMPLIR_GRILLE_PRODEMANDE]
    				 @Profil int
    AS
    BEGIN
     
    	DECLARE @Script varchar(8000)
    	SET @Script = 'SELECT DISTINCT DEMANDE_INTERVENTION.IdDemande_PK , DEMANDE_INTERVENTION.Objet , 
    						DEMANDE_INTERVENTION.DteDemande , DEMANDE_INTERVENTION.DteDebut  , 
    						DEMANDE_INTERVENTION.DteFin, DEMANDE_INTERVENTION.NomDemandeur, DEMANDE_INTERVENTION.PrenomDemandeur, 
    						DEMANDE_INTERVENTION.IdClient_FK,DEMANDE_INTERVENTION.IdStatut_FK, DEMANDE_INTERVENTION.Observations  
    					FROM  DEMANDE_INTERVENTION inner join STATUT inner join PROFIL_STATUT
    					ON STATUT.IdStatut_PK = PROFIL_STATUT.IdStatut_FK
    					ON DEMANDE_INTERVENTION.IdStatut_FK = PROFIL_STATUT.IdStatut_FK
    					WHERE PROFIL_STATUT.IdProfil_FK = + @Profil'
    	SET @Script = @Script
    	EXEC(@Script)
    END
    Et voilà le résultat que j'obtiens :
    Msg 137, Niveau 15, État 2, Ligne 8
    La variable scalaire "@Profil" doit être déclarée.

    (1 ligne(s) affectée(s))

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Il faut ou bien ajouter la chaine directement - et donc ne pas laisser @Profil dans la chaine, mais la valeur utilisée - ce qui n'est pas conseillé si la requête est souvent exécutée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	SET @Script = 'SELECT DISTINCT DEMANDE_INTERVENTION.IdDemande_PK , DEMANDE_INTERVENTION.Objet , 
    						DEMANDE_INTERVENTION.DteDemande , DEMANDE_INTERVENTION.DteDebut  , 
    						DEMANDE_INTERVENTION.DteFin, DEMANDE_INTERVENTION.NomDemandeur, DEMANDE_INTERVENTION.PrenomDemandeur, 
    						DEMANDE_INTERVENTION.IdClient_FK,DEMANDE_INTERVENTION.IdStatut_FK, DEMANDE_INTERVENTION.Observations  
    					FROM  DEMANDE_INTERVENTION inner join STATUT inner join PROFIL_STATUT
    					ON STATUT.IdStatut_PK = PROFIL_STATUT.IdStatut_FK
    					ON DEMANDE_INTERVENTION.IdStatut_FK = PROFIL_STATUT.IdStatut_FK
    					WHERE PROFIL_STATUT.IdProfil_FK = '+ CONVERT(VARCHAR,@Profil)



    Ou bien déclarer la variable lors de l'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    DECLARE @ParmDefinition nvarchar(500)
    DECLARE @Script varchar(8000)
     
    SET @ParmDefinition = N'@ProfilUsed int'
     
     
    	SET @Script = 'SELECT DISTINCT DEMANDE_INTERVENTION.IdDemande_PK , DEMANDE_INTERVENTION.Objet , 
    						DEMANDE_INTERVENTION.DteDemande , DEMANDE_INTERVENTION.DteDebut  , 
    						DEMANDE_INTERVENTION.DteFin, DEMANDE_INTERVENTION.NomDemandeur, DEMANDE_INTERVENTION.PrenomDemandeur, 
    						DEMANDE_INTERVENTION.IdClient_FK,DEMANDE_INTERVENTION.IdStatut_FK, DEMANDE_INTERVENTION.Observations  
    					FROM  DEMANDE_INTERVENTION inner join STATUT inner join PROFIL_STATUT
    					ON STATUT.IdStatut_PK = PROFIL_STATUT.IdStatut_FK
    					ON DEMANDE_INTERVENTION.IdStatut_FK = PROFIL_STATUT.IdStatut_FK
    					WHERE PROFIL_STATUT.IdProfil_FK = @ProfilUsed'
     
    EXECUTE sp_executesql @Script , @ParmDefinition,
                          @ProfilUsed = @Profil;

  3. #3
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE PROFIL_STATUT.IdProfil_FK = '+ CONVERT(VARCHAR,@Profil)
    /!\ Attention, lorsque la longueur du VARCHAR n'est pas spécifiée dans le CONVERT (ou CAST) la longueur par défaut est 30. Donc tenir compte de la longueur maximale de @Profile.
    Je te propose dans ta procédure de :
    0. d'abord tester si le profile en entrée est un entier (integer); si oui alors
    1. construire ta requête puis exécuter
    Il faut aussi prendre l'habitude d'imposer l'option au début des procédures stockées.
    Etienne ZINZINDOHOUE
    Billets-Articles

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par zinzineti Voir le message
    Il faut aussi prendre l'habitude d'imposer l'option au début des procédures stockées.

    Cela apporte... ? (un gain en performance ?)

  5. #5
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Cela apporte... ? (un gain en performance ?)
    L'option évite le renvoi du message indiquant le nombre de lignes retournées par la requête. Donc diminue le niveau de bavardage côté SGBD. On économise ainsi des ressources et donc gain de perf
    Etienne ZINZINDOHOUE
    Billets-Articles

  6. #6
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Sur la théorie, 100% d'accord. Mais en pratique, est-ce vraiment significatif ? Dans mon environnement de travail, je pense que je ne verrai jamais la différence alors je vous demande...

Discussions similaires

  1. [Débutant] variable scalaire doit être déclarée
    Par 136mdc dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 14/03/2014, 09h30
  2. Erreur : La variable scalaire "@variable" doit être déclarée
    Par oliviers92 dans le forum Développement
    Réponses: 6
    Dernier message: 24/09/2013, 23h17
  3. Erreur La variable scalaire "@var" doit être déclarée.
    Par sawnet dans le forum Développement
    Réponses: 1
    Dernier message: 21/11/2012, 10h40
  4. [Débutant] La variable scalaire "" doit être déclarée.
    Par _Tido_ dans le forum ASP.NET
    Réponses: 1
    Dernier message: 01/03/2012, 13h22
  5. Réponses: 2
    Dernier message: 31/05/2011, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo