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 :

Requête dynamique avec des chaînes Unicodes


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2008
    Messages : 59
    Points : 52
    Points
    52
    Par défaut Requête dynamique avec des chaînes Unicodes
    Bonjour,
    Je n'arrive pas à exécuter ma requête T-SQL dynamique lorsque celle-ci vise des champs au format Unicode (nvarchar). Voici un exemple concret que vous pouvez essayer, qui illustre mon problème.

    Voici le code de création de la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE [dbo].[essai](
    	[Id] [int] NOT NULL,
    	[Nom] [nvarchar](50) NULL,
    	[Prenom] [nvarchar](50) NULL,
    	[Age] [int] NULL
    )
    Cette table contient les éléments suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Id | Nom | Prenom | Age
    1  | Hugo | Victor | 80
    2  | Lagaffe | Gaston | 25
    Voici le code de ma requête dynamique exemple. Bien sûr elle n'a pas beaucoup d'intérêt puisque je ne lui passe aucune variable en paramètre, mais c'est le cas de ma véritable requête et cela ne fonctionne pas non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    declare @sql nvarchar(100)
    declare @param nvarchar (200)
    declare @test nvarchar(200)
     
    set @param = N'@answer nvarchar(200) output'
     
    set @sql = N'select @answer = Age From essai where Id = 1'
    exec sp_executesql @sql, @param, @answer = @test output
    print @test
     
    set @sql = N'select @answer = Age From essai where Nom = Hugo and Prenom = Victor'
    exec sp_executesql @sql, @param, @answer = @test output
    Voici les messages d'erreurs générés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    80
    Msg*207, Niveau*16, État*1, Ligne*1
    Nom de colonne non valide*: 'Hugo'.
    Msg*207, Niveau*16, État*1, Ligne*1
    Nom de colonne non valide*: 'Victor'.
    Vous noterez que ma première requête est passée sans problème (j'interroge le champs Id qui est en int) et que la deuxième a planté (cette fois-ci ce sont deux colonnes nvarchar que j'interroge)
    Est-ce normal, comment contourner ce problème, cela vient-il de mon code ?

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    essayez ca!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET @sql = N'select @answer = Age From essai where Nom = ''Hugo'' and Prenom = ''Victor'' '
    exec sp_executesql @sql, @param, @answer = @test output

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2008
    Messages : 59
    Points : 52
    Points
    52
    Par défaut Comment positionner les parenthèses avec des variables ?
    Bonjour et merci pour la réponse. Il semble en effet que le problème provienne du système de parenthésage, le problème est : comment parenthéser une variable ? Je m'explique l'exemple que j'ai donné précédemment ne reflète pas la réalité dans laquelle je me trouve, car je n'utilise pas de valeurs "entrées en dur" mais des variables.

    Voici donc mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -- Récupération de la valeur de la cellule de la table à la quelle appartient l'enregistrement lu, afin de savoir s'il faut réaliser un update ou un insert
    SET @SQL2 = N'SELECT @answer = Montant FROM income_statement WHERE Annee = '+ @nYear +' AND Mois = '+ @nMonthNum +' AND Nomenclature = '+ @nomenclature
    print @SQL2
    EXEC sp_ExecuteSQL @SQL2, @param, @answer = @test OUTPUT
    Voici une proposition de modification en ajoutant des parenthéses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SET @SQL2 = N'SELECT @answer = Montant FROM income_statement WHERE Annee = '+ @nYear +' AND Mois = '+ @nMonthNum +' AND Nomenclature = '''+ @nomenclature +''
    print @SQL2
    EXEC sp_ExecuteSQL @SQL2, @param, @answer = @test OUTPUT
    Qui génère le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT @answer = Montant FROM income_statement WHERE Annee = 2007 AND Mois = 1 AND Nomenclature = 'B_cost_of_mat
    Msg*105, Niveau*15, État*1, Ligne*1
    Ouvrez les guillemets après la chaîne de caractères 'B_cost_of_mat'.
    Msg*102, Niveau*15, État*1, Ligne*1
    Syntaxe incorrecte vers 'B_cost_of_mat'.
    EDIT : 08h46

    J'essaie depuis ce matin sans aucun succès, mais il semble que j'ai réussi à obtenir ce que je souhaire avec le code suivant (très étrange le nombre de parenthèses ouvertes ne correspond pas avec le nombre de parenthéses fermantes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SET @SQL2 = N'SELECT @answer = Montant FROM income_statement WHERE Annee = '+ @nYear +' AND Mois = '+ @nMonthNum +' AND Nomenclature = '''+ @nomenclature +''''
    print @SQL2
    EXEC sp_ExecuteSQL @SQL2, @param, @answer = @test OUTPUT
    Aucun message d'erreurs n'apparaît, mais est-ce la bonne solution ?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET @SQL2 = N'SELECT @answer = Montant FROM income_statement WHERE Annee = '+ @nYear +' AND Mois = '+ @nMonthNum +' AND Nomenclature = '' '+ @nomenclature + ' '' '
    print @SQL2
    EXEC sp_ExecuteSQL @SQL2, @param, @answer = @test OUTPUT
    oui, c'est juste!

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2008
    Messages : 59
    Points : 52
    Points
    52
    Par défaut Merci Ylarvor
    Merci beaucoup mon problème est résolu, bonne journée.

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

Discussions similaires

  1. [WD19] Requête dynamique avec chaîne construite
    Par buzz68180 dans le forum WinDev
    Réponses: 6
    Dernier message: 14/11/2014, 09h40
  2. Réponses: 7
    Dernier message: 15/04/2014, 19h44
  3. Réponses: 5
    Dernier message: 23/11/2012, 12h52
  4. Gestion des sprites dynamiques avec liste chaînée
    Par Mokona dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/12/2010, 14h55
  5. Réponses: 3
    Dernier message: 16/12/2006, 12h59

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