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 :

[SQL2008][TSQL] - Utilisation des variables dans des requêtes Transact-SQL


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [SQL2008][TSQL] - Utilisation des variables dans des requêtes Transact-SQL
    Bien le bonjour à toutes et à tous.

    Je me retrouve à dérouiller mon Transact-SQL sur SQL Server, ce qui s'avère douloureux... (j'en étais resté au PL-SQL il y a bien longtemps)

    Mon objectif c'est de parcourir une table (R_Hermes), et pour chaque ligne, trouver l'id correspondant à une description, qui se trouve dans une table tiers.

    Je me heurte à deux questions de syntaxe (ou de logique ?) (j'ai mis le source complet en bas du post...) :

    - dans une requête select, je ne parviens pas à utiliser une variable décrite plus haut :

    WHERE desc_Charge_Affaire like @vchDescChargeAffaire

    Il n'aime pas mon @vchDescChargeAffaire. Ca ressemble pourtant beaucoup aux exemples que j'ai pu trouver... Là je sèche. J'ai droit à un message royal de détails :
    Msg 102, Level 15, State 1, Line 27
    Syntaxe incorrecte vers '@vchDescChargeAffaire'.


    - Pour la mise à jour dans ma table de départ, j'ai tenté divers méthode, j'ai crû comprendre dans mes recherches que la seule bonne méthode était de créer une chaine de caractères de ma requête et de faire un exec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set @Query = 'UPDATE dbo.R_Hermes SET id_Charge_Affaire = ' + @iIdChargeAffaire + 'WHERE CURRENT OF Repository;'
    exec (@query)
    Il me déclare que la variable scalaire Query doit être déclarée. Là, j'ai repris un exemple glané, je comprends pas non plus.
    J'ai tenté divers combinaison, des incantations, à part une formation SQL server je ne vois plus de pistes...

    Voici le détail de mon "oeuvre", et merci d'avance pour toute aide potentielle ou soutien moral. Si à défaut, vous avez un job vacant de ceuilleur de fruits dans le sud, çà me va aussi. Faut pas s'acharner, l'informatique ne veux pas (plus) de moi. L'assembleur me manque, dés qu'une syntaxe dépasse les 6 caratères par ligne, je suis plus...

    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
    ------------
     
    SET NOCOUNT ON
     
    -- déclaration des variables
    DECLARE  
             @iIdChargeAffaire            int,
             @vchDescChargeAffaire        nvarchar(100),
             @Query                        varchar(500)
     
    -- déclaration du curseur
    DECLARE Repository CURSOR FOR 
    SELECT   
              desc_Charge_Affaire
    FROM      dbo.R_Hermes
    FOR UPDATE
     
    OPEN Repository
     
    FETCH Repository INTO @vchDescChargeAffaire
     
    -- Traitement pour chaque ligne
    WHILE @@Fetch_Status = 0
       BEGIN
     
    -- Recherche de l'id
       SELECT @iIdChargeAffaire = id_Charge_Affaire 
       FROM dbo.T_Charge_Affaire
       WHERE desc_Charge_Affaire LIKE @vchDescChargeAffaire
       GO
     
     -- Mise à jour de l'id
       set @Query = 'UPDATE dbo.R_Hermes SET id_Charge_Affaire = ' + @iIdChargeAffaire + 'WHERE CURRENT OF Repository;'
       exec (@query)
     
          FETCH Repository INTO @vchDescChargeAffaire
       END
     
    CLOSE Repository
    DEALLOCATE Repository
    RETURN

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 544
    Points
    52 544
    Billets dans le blog
    5
    Par défaut
    C'est votre GO qui est responsable de tous ces mots. GO n'est pas une instruction SQL mais une commande pour l'outil client !

    Au passage : pas besoin de SQL Dyanmique

    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
    SET NOCOUNT ON
     
    -- déclaration des variables
    DECLARE @iIdChargeAffaire int,
            @vchDescChargeAffaire nvarchar(100),
            @Query varchar(500);
     
    -- déclaration du curseur
    DECLARE Repository CURSOR 
    FOR
       SELECT desc_Charge_Affaire
       FROM   dbo.R_Hermes
    FOR UPDATE;
     
    OPEN Repository;
     
    FETCH Repository INTO @vchDescChargeAffaire;
     
    -- Traitement pour chaque ligne
    WHILE @@Fetch_Status = 0
    BEGIN
     
       -- Recherche de l'id
       SELECT @iIdChargeAffaire = id_Charge_Affaire
       FROM   dbo.T_Charge_Affaire
       WHERE desc_Charge_Affaire LIKE @vchDescChargeAffaire
     
     
       -- Mise à jour de l'id
       UPDATE dbo.R_Hermes 
       SET    id_Charge_Affaire = @iIdChargeAffaire
       WHERE  CURRENT OF Repository;
     
       FETCH Repository INTO @vchDescChargeAffaire;
     
    END
     
    CLOSE Repository;
    DEALLOCATE Repository;
     
    RETURN
    Enfin tout ce code se résumé à une seule instruction UPDATE que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       UPDATE dbo.R_Hermes 
       SET    id_Charge_Affaire = CA.id_Charge_Affaire
       FROM   dbo.T_Charge_Affaire AS CA
       WHERE  desc_Charge_Affaire LIKE @vchDescChargeAffaire;
    Et qui sera 100 à 10 000 fois plus rapide !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, effectivement la requête fait ce que je voulais en 3 lignes.
    Je vais retourner prendre des cours de SQL...

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

Discussions similaires

  1. Mettre des variables dans une requête SQL
    Par tamtam64 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 20/01/2015, 13h25
  2. [Dojo] Utiliser des variable dans des fichiers nls (dojo 1.7)
    Par devkaty dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 31/05/2012, 12h44
  3. Insérer des variables dans une Requête
    Par Dormeur74 dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/07/2011, 07h51
  4. Réponses: 6
    Dernier message: 01/04/2007, 20h13
  5. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23

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