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 :

Une variable dans une requête INSERT


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut Une variable dans une requête INSERT
    Bonjour,


    Je développe en ASP.NET et je fais une requête INSERT paramétrée avec ADO.NET.

    Mais il y a une des valeurs que je souhaite récupérée soit par une sous requête, soit par une variable mais je n'y arrive pas.

    Voila à peu près ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO maTable ((SELECT MAX(valeur) FROM uneAutreTable), @param1, param2)
    ce qui ne fonctionne pas car apparamment seul les fonctions scalaires sont autorisées.

    de même si je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @valeur = SELECT MAX(valeur) FROM uneAutreTable;
    INSERT INTO maTable (@valeur, @param1, param2)
    ça ne marche pas car @valeur est confondu avec mes @param1 et @param2 de ADO.NET au niveau de ma requête paramétrée. Il me dit alors que @valeur n'est pas renseignée (en effet dans mon code asp.net C#, je ne la déclare pas puisqu'elle est dans une variable SQL)

    Si quelqu'un a une idée, je suis preneur.

    Sinon, dans le pire des cas, j'utiliserai une transaction serializable entre mes lignes de C# pour récupérer dans un premier temps le SELECT MAX, puis dans un deuxieme temps faire mon insert avec ma valeur récupérée (ça me fera deux lots de requêtes au lieu d'un)

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    et ça : ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @valeur =MAX(valeur) FROM uneAutreTable;
    INSERT INTO maTable (@valeur, @param1, param2)

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Bonjour phili_b,

    Merci.

    Malheureusement, ça n'a pas marché. J'ai toujours l'erreur qui me dit que @code doit être déclarée. C'est du à la requête paramétrée ADO.NET sur laquelle je précise le @param1 et le @param2. Du coup ça se confond avec le @code..

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    En une seule requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO maTable
    SELECT A.valeurMax, @param1, @param2
    FROM
    (SELECT MAX(valeur) AS valeurMax FROM uneAutreTable) A
    Et sinon, les procédures stockées, ça existe. C'est pas mal quand on ne peut pas tout faire en une seule requête.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    La requete initiale ne risquait pas de marcher car les paramétres n'était pas passés au bon endroit, ils doivent être dans le select, il y avait aussi des problèmes de parenthèses.
    J'ai rajouté la liste des colonnes qui est optionnelle mais qui permet de rajouter des colonnes facultatives dans une tables, sans reprendre tous les insert.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO maTable 
    (Column1,Column2,column3)
    SELECT MAX(valeur), @param1, @param2 FROM uneAutreTable
    a+
    Soazig

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Merci à vous deux,
    Vos deux requêtes fonctionnent très bien !

    J'ai cette impression d'avoir appris quelque chose de nouveau aujourd'hui

    Pour la procédure stockée, c'est vrai j'aurai pu. Mais on en utilise très peu chez nous, et je voulais explorer cette piste. D'autre part c'est ce que j'aurai peut être du faire, vous avez raison, si j'avais opté pour la transaction serializable. A moyen ou long terme, on devrait utiliser plus de procédures stockées, c'est prévu.

    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  2. Récupérer le nom d'une colonne d'une table dans une variable
    Par mimi51340 dans le forum Général Java
    Réponses: 4
    Dernier message: 13/03/2008, 14h23
  3. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  4. Réponses: 1
    Dernier message: 15/02/2007, 00h24
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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