Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/05/2008, 16h38   #1
Membre à l'essai
 
Adrien
Inscription : avril 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Adrien
Âge : 27

Informations forums :
Inscription : avril 2008
Messages : 59
Points : 21
Points : 21
Envoyer un message via MSN à Adorien
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 :
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 :
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 :
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 :
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 ?
Adorien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 19h34   #2
Membre Expert
 
Inscription : août 2002
Messages : 1 249
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 249
Points : 1 512
Points : 1 512
Envoyer un message via Yahoo à ylarvor
essayez ca!

Code :
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
ylarvor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 08h41   #3
Membre à l'essai
 
Adrien
Inscription : avril 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Adrien
Âge : 27

Informations forums :
Inscription : avril 2008
Messages : 59
Points : 21
Points : 21
Envoyer un message via MSN à Adorien
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 :
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 :
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 :
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 :
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 ?
Adorien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 09h06   #4
Membre Expert
 
Inscription : août 2002
Messages : 1 249
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 249
Points : 1 512
Points : 1 512
Envoyer un message via Yahoo à ylarvor
Code :
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!
ylarvor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h35   #5
Membre à l'essai
 
Adrien
Inscription : avril 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Adrien
Âge : 27

Informations forums :
Inscription : avril 2008
Messages : 59
Points : 21
Points : 21
Envoyer un message via MSN à Adorien
Par défaut Merci Ylarvor

Merci beaucoup mon problème est résolu, bonne journée.
Adorien est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h44.


 
 
 
 
Partenaires

Hébergement Web