Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 07/04/2011, 11h10   #1
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
Par défaut liste d'id nvarchar dans IN ()

Bonjour,

Par requête j'obtiens une liste d'Id dans ma variable @result
select @result me retourne 6,10,51 ...

puis dans une autre requête je fais :
select * from toto where idTata in (@result)

et là j'obtiens une erreur :
Échec de la conversion de la valeur nvarchar '6, 10, 11, 84, 87, 220, 287, 478, 572, 573, 576, 620, 631, 632, 636, 1764, 3961, 3963, 3964, 4153, 4154, 4155, 4156, 4157, 4158, 4995, 4998, 16482' en type de données int.

Comment puis convertir cette liste ?
j'ai essayé avec convert sans succès !
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 11h19   #2
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
C'est bon j'ai réussi !!!
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 11h59   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

D'abord stocker un entier dans un nvarchar est bête pour deux raisons :

- on stocke des entiers dans un type entier

- nvarchar utilise Unicode, et donc 2 octets par caractère, pour stocker les chaînes de caractères contenant des littéraux provenant d'alphabets non-latins.
Si vous aviez utilisé du varchar, vous n'occupez qu'un seul octet par caractère, puisqu'alors c'est ASCII qui est utilisé ...

Citation:
Par requête j'obtiens une liste d'Id dans ma variable @result
Dans ce cas vous pouvez utiliser la requête qui peuple la variable de type table pour écrire une seule requête !

Code :
SELECT * FROM toto WHERE idTata IN (@result)


IN introduit une liste de valeurs, donc à la place de @result, vous auriez du écrire SELECT uneColonne FROM @result.

L'écriture suivante est un peu plus élégante :

Code :
1
2
3
SELECT		T.*
FROM		dbo.toto AS T
INNER JOIN	@result AS R ON T.idTata = R.uneColonne
Vous noterez au passage que pour une variable de type table, SQL Server estime toujours qu'elle ne contient qu’une seule ligne, ce qui conduit à la création de plan de requête contenant des défauts d'estimations de cardinalités fausses, et donc des requêtes longues ...

Dès SQL Server 2005, vous pouvez écrire :

Code :
1
2
3
4
5
6
7
8
;WITH
	CTE AS
	(
		-- requête pour peupler @result
	)
SELECT		T.*
FROM		dbo.toto AS T
INNER JOIN	CTE AS R ON T.idTata = R.uneColonne
Ce qui vous évitera en plus d'avoir recours à la base de données système TempDB

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket 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 05h49.


 
 
 
 
Partenaires

Hébergement Web