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

MS SQL Server Discussion :

Erreur "Must declare the scalar variable "@id"


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut Erreur "Must declare the scalar variable "@id"
    Bonjour
    J'ai fais une procédure stockée pour insérer des données dans ma base, et j'ai une erreur que je ne comprend pas et n'arrive pas à résoudre.
    Must declare the scalar variable "@id". Voici mon code :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    CREATE PROCEDURE [dbo].[Insert_Langue] 
    	-- Add the parameters for the stored procedure here
            @id int = null,
    	@lvl int = null,
    	@name nvarchar (100)= null
     
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
     
    	declare @la_id int;
    	select   @la_id = la_id from LANGUE where la_name = @name;
     
    	declare @Query nvarchar(MAX);
    	declare @Query2 nvarchar(MAX);
    	declare @Param nvarchar(MAX);
     
    	BEGIN TRANSACTION 	
    	SET NOCOUNT ON;
     
    	set @Query ='';
    	Set @Param = @Param  + ',@id int '	
    	Set @Param = @Param  + ',@lvl int '
    	Set @Param = @Param  + ',@name nvarchar(100) '
     
     
     
        -- Insert into DB
                set @Query = 'INSERT INTO [dbo].[USER_LANGUE] ';
    			set @Query = + @Query + '([id] ' ;
    			set @Query2 =  ' VALUES (@id';
     
    			if (@la_id <> NULL ) BEGIN 
    				set @Query = @Query + ',[la_id] ';
    				set @Query2 =@Query2 + ', @la_id';
    			END
     
    			if (@la_id <> NULL ) BEGIN 
    				set @Query = @Query + ',[lvl] ';
    				set @Query2 =@Query2 + ', @lvl';
    			END
    			set @Query = + @Query + ') ' + @Query2+ ')'
     
    			IF (@Query <> '' ) 
    			begin
     
    			EXECUTE sp_executesql  @Query, @Param, @id = @id 
                                                              @la_id = @la_id,
                                                              @lvl = @lvl
                            end
    COMMIT TRANSACTION
    END
    Merci d'avance pour votre aide

    Dev

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Dans un premier temps, il manque la déclaration de la création ou mise à jour de la procédure stockée : CREATE PROC dbo.nom_de_la_procédure
    (Peut être un mauvais copier/coller)

    Ensuite, ne pas utiliser IF (@la_id <> NULL ) mais @la_id IS NOT NULL

    Pour le problème initial, c'est une virgule dans le code ci-dessous qui est manquante

    EXECUTE sp_executesql @Query, @Param, @id = @id ,
    @la_id = @la_id,
    @lvl = @lvl

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Salut,

    Oui, c'était un mauvais copié collé pour le nom de la procédure. J'ai corrigé.

    J'ai changé mes IF (@la_id <> NULL ) en @la_id IS NOT NULL

    Mais pourquoi en fait? <> NULL et IS NOT NULL n'est ce pas la même chose?

    Merci

    EDIT : J'ai aussi corrigé la virgule, mais le problème persiste Toujours la même erreur

  4. #4
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Citation Envoyé par Devlin111 Voir le message
    Mais pourquoi en fait? <> NULL et IS NOT NULL n'est ce pas la même chose?
    Je vous propose de lire cet article complet qui vous donnera toutes les informations nécessaires et bien plus :
    http://sqlpro.developpez.com/cours/null/

    Citation Envoyé par Devlin111 Voir le message
    EDIT : J'ai aussi corrigé la virgule, mais le problème persiste Toujours la même erreur
    Hum, bizarre quand je mets la virgule je n'ai plus l'erreur, voici le code complet :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    CREATE PROCEDURE [dbo].[Insert_Langue] 
     
    	@id int = NULL,
    	@lvl int = NULL,
    	@name nvarchar (100)= NULL
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
     
    	declare @la_id int;
    	SELECT   @la_id = la_id FROM LANGUE WHERE la_name = @name;
     
    	declare @Query nvarchar(MAX);
    	declare @Query2 nvarchar(MAX);
    	declare @Param nvarchar(MAX);
     
    	BEGIN TRANSACTION 	
    	SET NOCOUNT ON;
     
    	SET @Query ='';
    	SET @Param = @Param  + ',@id int '	
    	SET @Param = @Param  + ',@lvl int '
    	SET @Param = @Param  + ',@name nvarchar(100) '
     
       -- Insert into DB
                SET @Query = 'INSERT INTO [dbo].[USER_LANGUE] ';
    			SET @Query = + @Query + '([id] ' ;
    			SET @Query2 =  ' VALUES (@id';
     
    			IF (@la_id IS NOT NULL ) BEGIN 
    				SET @Query = @Query + ',[la_id] ';
    				SET @Query2 =@Query2 + ', @la_id';
    			END
     
    			IF (@la_id IS NOT NULL ) BEGIN 
    				SET @Query = @Query + ',[lvl] ';
    				SET @Query2 =@Query2 + ', @lvl';
    			END
    			SET @Query = + @Query + ') ' + @Query2+ ')'
     
    			IF (@Query <> '' ) 
    			begin
     
    			EXECUTE sp_executesql  @Query, @Param
    					, @id = @id,
    					  @la_id = @la_id,
    					  @lvl = @lvl
                end
    COMMIT TRANSACTION
     
    END

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Merci pour l'article.
    J'ai exactement le même code que le tien, et pourtant l'erreur persiste

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Etrange, je viens de copier/coller le code que j'ai posté au dessus, j'ai exécuté à nouveau ce code et tout passe correctement.

    Tu peux faire la même manipulation si ce n'est déjà fait, au cas où il y aurait une petite différence non visible au premier coup d'oeil ?

    C'est bien le même message d'erreur ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Oui, j'ai fais un copié collé, mais lorsque j'éxécute la PS, toujours l'erreur "Must declare the scalar variable "@id" "

  8. #8
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Ne pouvant expliquer pourquoi ça ne s'exécute pas chez toi, je me suis un peu plus penché sur ce que tu cherches à faire.

    Je passe sur les noms de procédures, table...
    Il semblerait que tu cherches à insérer une ligne dans la table [USER_LANGUE], avec soit :
    - 1 valeur pour 3 colonnes différentes (id, la_id et lvl) si tu trouves une valeur pour la_id dans la table [Langue] (en filtrant sur la colonne name)
    - 1 valeur pour une seule colonne (id) si tu ne trouve pas de valeur pour la_id

    Je te propose donc plutôt d'utiliser le script suivant :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    CREATE PROCEDURE [dbo].[Insert_Langue] 
     
    	@id int = NULL,
    	@lvl int = NULL,
    	@name nvarchar (100)= NULL
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
     	SET NOCOUNT ON;
     
    	DECLARE @la_id INT; 
    	DECLARE @Query NVARCHAR(MAX);
    	DECLARE @Query2 NVARCHAR(MAX);
    	DECLARE @Param NVARCHAR(MAX);
     
    	SELECT   @la_id = la_id FROM LANGUE WHERE la_name = @name;
     
    	-- Si la variable << @la_id >> contient une valeur, 
    	-- insertion d'une ligne dans la table [USER_LANGUE] en renseignant les 3 valeurs connues : 
    	--	. [id], 
    	--	. [la_id], 
    	--	. [lvl]
    	IF (@la_id IS NOT NULL ) 
    	BEGIN 
    		INSERT INTO [dbo].[USER_LANGUE] ([id], [la_id], [lvl])
    		VALUES (@id, @la_id, @lvl);
    	END
    	-- Sinon, insertion d'une ligne dans la table [USER_LANGUE] en renseignant uniquement la value connue : 
    	--	 . [id]
    	ELSE
    	BEGIN 
    		INSERT INTO [dbo].[USER_LANGUE] ([id]) VALUES (@id);
    	END
    END

  9. #9
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Ton problème initial vient uniquement du fait que tu utilise @id en tant que texte dans du sqldynamique (tu executes un texte...)
    Quand la requete est lancée elle l'est dans son propre contexte donc @id n'est pas trouvé.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Re bonjour

    iberserk, j'ai trouvé mon erreur finalement


    SQLDev, non, ce n'est pas cela que je cherche à faire, mais je me suis aperçu en reprenant ligne par ligne que j'avais fais quelques erreurs de copié collé, dont une, celle qui posait problème :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare @Query nvarchar(MAX);
    	declare @Query2 nvarchar(MAX);
    	declare @Param nvarchar(MAX);
     
    	BEGIN TRANSACTION 	
    	SET NOCOUNT ON;
     
    	SET @Query ='';
    	SET @Param = @Param  + ',@id int '	
    	SET @Param = @Param  + ',@lvl int '
    	SET @Param = @Param  + ',@name nvarchar(100) '
    Ici, je n'ai pas initialisé @Param, du coup, je démarrais par ','.
    Je devais soit mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @Param nvarchar(MAX) = ' ';
     
    SET @Query ='';
    	SET @Param = @Param  + ',@id int '	
    	SET @Param = @Param  + ',@lvl int '
    	SET @Param = @Param  + ',@name nvarchar(100) '
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @Param nvarchar(MAX);
     
            SET @Query ='';
    	SET @Param = '@id int '	
    	SET @Param = @Param  + ',@lvl int '
    	SET @Param = @Param  + ',@name nvarchar(100) '
    Voilà, problème résolu (et j'ai aussi corrigé les petites erreurs de c/c, ma PS fonctionne). Merci pour l'aide

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Desolé je me suis trompé

Discussions similaires

  1. error "must declare the scalar variable "@codemodule"
    Par AngeAbstraction dans le forum VB.NET
    Réponses: 4
    Dernier message: 11/04/2012, 20h34
  2. Réponses: 1
    Dernier message: 20/05/2009, 13h50
  3. Must Declare the scalare variable - Transact SQL
    Par xav13fr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/07/2008, 10h41
  4. message d'erreur avec la declaration d'une variable
    Par safezahra dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/06/2008, 00h48
  5. [sql server 2005] must declare the scalar variable @ ?
    Par sun19 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 30/04/2008, 12h08

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