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 22/06/2008, 16h59   #1
Membre habitué
 
Avatar de Cyrilange
 
Inscription : février 2004
Messages : 179
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 179
Points : 138
Points : 138
Envoyer un message via MSN à Cyrilange
Par défaut [SQL Serveur 2005] Requête sur un champ de type XML

Bonjour,

J'ai une table "Reports" qui contient un champ de type XML "reportXml".
Le contenu de ce champ est :
Code :
1
2
3
4
5
 
<RegistreDeSecurite>
<Done>true</Done>
<IsValid>false</IsValid>
</RegistreDeSecurite>
Je fais une requête pour obtenir les lignes qui ont pour valeur Done=false et IsValid=false.

Voici ma requête :
Code :
1
2
3
4
5
 
SELECT        pkReport, fkCompany, reportXml
FROM          Reports
WHERE        (fkCompany = @pkCompany) AND ((reportXml.exist('/ReportRegistreSecurite/IsValid/value ="false"') =1) 
AND (reportXml.exist('/ReportRegistreSecurite/Done/value ="false"')=1))
Malgré que la valeur de ma ligne soit Done=true, la ligne est quand même retournée. Pourquoi ? Merci de me dire où j'ai fait une erreur.
__________________
cyrilhome.over-blog.net
Cyrilange est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2008, 17h39   #2
Membre habitué
 
Avatar de Cyrilange
 
Inscription : février 2004
Messages : 179
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 179
Points : 138
Points : 138
Envoyer un message via MSN à Cyrilange
J'ai contourné le problème en utilisant value au lieu d'exist de cette façon :

Code :
1
2
3
4
 
SELECT        pkReport, fkCompany, reportXml
FROM          Reports
WHERE        (fkCompany = @pkCompany)  AND reportXml.value('/ReportRegistreSecurite[1]/Done[1]','nvarchar(5)')=@IsDone AND reportXml.value('/ReportRegistreSecurite[1]/IsValid[1]','nvarchar(5)')=@IsValid
Cependant j'aurais préféré utilisé exist qui est plus rapide.
__________________
cyrilhome.over-blog.net
Cyrilange est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 05h58   #3
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
moi aussi, j'aurais utilisé value! L'important, c'est d'avoir trouvé une solution viable et qui ne plombe pas trop les performances. Pour info, qu'est ce qui vous dit que exist soit plus rapide ?
ylarvor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 07h15   #4
Membre habitué
 
Avatar de Cyrilange
 
Inscription : février 2004
Messages : 179
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 179
Points : 138
Points : 138
Envoyer un message via MSN à Cyrilange
En effet, comme dit le dicton : "Peu importe la couleur du chat du moment qu'on attrape la souris."

D'après ce que j'ai lu sur différent site, exist serait plus rapide que value.
Cela me parait logique car d'un coté exist génére une valeur boolean 0 ou 1 alors que de l'autre value va chercher une chaîne de caractère de longueur variable et la retourne.
Ceci étant dit, la différence ne doit pas être énorme, et value sera très bien pour ce que je veux faire
__________________
cyrilhome.over-blog.net
Cyrilange est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h08.


 
 
 
 
Partenaires

Hébergement Web